Skip to content

Commit 4d6ec63

Browse files
committed
wip - trying out new solution
1 parent 496b30c commit 4d6ec63

File tree

2 files changed

+26
-25
lines changed

2 files changed

+26
-25
lines changed

pandas/io/sql.py

+23-12
Original file line numberDiff line numberDiff line change
@@ -1006,7 +1006,7 @@ def _execute_insert(self, conn, keys: list[str], data_iter) -> int:
10061006
Each item contains a list of values to be inserted
10071007
"""
10081008
data = [dict(zip(keys, row)) for row in data_iter]
1009-
result = conn.execute(self.table.insert(), data)
1009+
result = self.pd_sql.execute(self.table.insert(), data)
10101010
return result.rowcount
10111011

10121012
def _execute_insert_multi(self, conn, keys: list[str], data_iter) -> int:
@@ -1023,7 +1023,7 @@ def _execute_insert_multi(self, conn, keys: list[str], data_iter) -> int:
10231023

10241024
data = [dict(zip(keys, row)) for row in data_iter]
10251025
stmt = insert(self.table).values(data)
1026-
result = conn.execute(stmt)
1026+
result = self.pd_sql.execute(stmt)
10271027
return result.rowcount
10281028

10291029
def insert_data(self) -> tuple[list[str], list[np.ndarray]]:
@@ -1662,8 +1662,14 @@ def execute(self, sql: str | Select | TextClause, params=None):
16621662
"""Simple passthrough to SQLAlchemy connectable"""
16631663
args = [] if params is None else [params]
16641664
if isinstance(sql, str):
1665-
return self.con.exec_driver_sql(sql, *args)
1666-
return self.con.execute(sql, *args)
1665+
execute_function = self.con.exec_driver_sql
1666+
else:
1667+
execute_function = self.con.execute
1668+
1669+
try:
1670+
return execute_function(sql, *args)
1671+
except Exception as exc:
1672+
raise DatabaseError(f"Execution failed on sql '{sql}': {exc}") from exc
16671673

16681674
def read_table(
16691675
self,
@@ -2077,9 +2083,9 @@ def delete_rows(self, table_name: str, schema: str | None = None) -> None:
20772083
self.meta.reflect(
20782084
bind=self.con, only=[table_name], schema=schema, views=True
20792085
)
2080-
with self.run_transaction() as con:
2086+
with self.run_transaction():
20812087
table = self.get_table(table_name, schema)
2082-
con.execute(table.delete())
2088+
self.execute(table.delete())
20832089

20842090
self.meta.clear()
20852091

@@ -2403,9 +2409,12 @@ def to_sql(
24032409
raise ValueError("datatypes not supported") from exc
24042410

24052411
with self.con.cursor() as cur:
2406-
total_inserted = cur.adbc_ingest(
2407-
table_name=name, data=tbl, mode=mode, db_schema_name=schema
2408-
)
2412+
try:
2413+
total_inserted = cur.adbc_ingest(
2414+
table_name=name, data=tbl, mode=mode, db_schema_name=schema
2415+
)
2416+
except Exception as exc:
2417+
raise DatabaseError("Execution failed") from exc
24092418

24102419
self.con.commit()
24112420
return total_inserted
@@ -2431,8 +2440,7 @@ def has_table(self, name: str, schema: str | None = None) -> bool:
24312440
def delete_rows(self, name: str, schema: str | None = None) -> None:
24322441
table_name = f"{schema}.{name}" if schema else name
24332442
if self.has_table(name, schema):
2434-
with self.con.cursor() as cur:
2435-
cur.execute(f"DELETE FROM {table_name}")
2443+
self.execute(f"DELETE FROM {table_name}").close()
24362444

24372445
def _create_sql_schema(
24382446
self,
@@ -2553,7 +2561,10 @@ def insert_statement(self, *, num_rows: int) -> str:
25532561

25542562
def _execute_insert(self, conn, keys, data_iter) -> int:
25552563
data_list = list(data_iter)
2556-
conn.executemany(self.insert_statement(num_rows=1), data_list)
2564+
try:
2565+
conn.executemany(self.insert_statement(num_rows=1), data_list)
2566+
except Exception as exc:
2567+
raise DatabaseError("Execution failed") from exc
25572568
return conn.rowcount
25582569

25592570
def _execute_insert_multi(self, conn, keys, data_iter) -> int:

pandas/tests/io/test_sql.py

+3-13
Original file line numberDiff line numberDiff line change
@@ -2718,7 +2718,6 @@ def test_delete_rows_success(conn_name, test_frame1, request):
27182718

27192719
@pytest.mark.parametrize("conn_name", all_connectable)
27202720
def test_delete_rows_is_atomic(conn_name, request):
2721-
adbc_driver_manager = pytest.importorskip("adbc_driver_manager")
27222721
sqlalchemy = pytest.importorskip("sqlalchemy")
27232722

27242723
table_name = "temp_frame"
@@ -2737,20 +2736,11 @@ def test_delete_rows_is_atomic(conn_name, request):
27372736
with pandasSQL.run_transaction() as cur:
27382737
cur.execute(table_stmt)
27392738

2740-
if conn_name != "sqlite_buildin" and "adbc" not in conn_name:
2741-
expected_exception = sqlalchemy.exc.IntegrityError
2742-
elif "adbc" in conn_name and "sqlite" in conn_name:
2743-
expected_exception = adbc_driver_manager.InternalError
2744-
elif "adbc" in conn_name and "postgres" in conn_name:
2745-
expected_exception = adbc_driver_manager.ProgrammingError
2746-
elif conn_name == "sqlite_buildin":
2747-
expected_exception = sqlite3.IntegrityError
2748-
27492739
with pandasSQL.run_transaction():
27502740
pandasSQL.to_sql(original_df, table_name, if_exists="append", index=False)
27512741

27522742
# inserting duplicated values in a UNIQUE constraint column
2753-
with pytest.raises(expected_exception):
2743+
with pytest.raises(pd.errors.DatabaseError):
27542744
with pandasSQL.run_transaction():
27552745
pandasSQL.to_sql(
27562746
replacing_df, table_name, if_exists="delete_rows", index=False
@@ -3473,8 +3463,8 @@ def test_to_sql_with_negative_npinf(conn, request, input):
34733463
mark = pytest.mark.xfail(reason="GH 36465")
34743464
request.applymarker(mark)
34753465

3476-
msg = "inf cannot be used with MySQL"
3477-
with pytest.raises(ValueError, match=msg):
3466+
msg = "Execution failed on sql"
3467+
with pytest.raises(pd.errors.DatabaseError, match=msg):
34783468
df.to_sql(name="foobar", con=conn, index=False)
34793469
else:
34803470
assert df.to_sql(name="foobar", con=conn, index=False) == 1

0 commit comments

Comments
 (0)