Skip to content

Commit e967648

Browse files
committed
wip - trying out new solution
1 parent 86fde24 commit e967648

File tree

2 files changed

+26
-23
lines changed

2 files changed

+26
-23
lines changed

pandas/io/sql.py

Lines changed: 25 additions & 12 deletions
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+
try:
1666+
return self.con.exec_driver_sql(sql, *args)
1667+
except Exception as exc:
1668+
raise DatabaseError("foo") from exc
1669+
try:
1670+
return self.con.execute(sql, *args)
1671+
except Exception as exc:
1672+
raise DatabaseError 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

@@ -2148,6 +2154,8 @@ def execute(self, sql: str | Select | TextClause, params=None):
21482154

21492155
ex = DatabaseError(f"Execution failed on sql '{sql}': {exc}")
21502156
raise ex from exc
2157+
finally:
2158+
cur.close()
21512159

21522160
def read_table(
21532161
self,
@@ -2403,9 +2411,12 @@ def to_sql(
24032411
raise ValueError("datatypes not supported") from exc
24042412

24052413
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-
)
2414+
try:
2415+
total_inserted = cur.adbc_ingest(
2416+
table_name=name, data=tbl, mode=mode, db_schema_name=schema
2417+
)
2418+
except Exception as exc:
2419+
raise DatabaseError("foo") from exc
24092420

24102421
self.con.commit()
24112422
return total_inserted
@@ -2431,8 +2442,7 @@ def has_table(self, name: str, schema: str | None = None) -> bool:
24312442
def delete_rows(self, name: str, schema: str | None = None) -> None:
24322443
table_name = f"{schema}.{name}" if schema else name
24332444
if self.has_table(name, schema):
2434-
with self.con.cursor() as cur:
2435-
cur.execute(f"DELETE FROM {table_name}")
2445+
self.execute(f"DELETE FROM {table_name}")
24362446

24372447
def _create_sql_schema(
24382448
self,
@@ -2553,7 +2563,10 @@ def insert_statement(self, *, num_rows: int) -> str:
25532563

25542564
def _execute_insert(self, conn, keys, data_iter) -> int:
25552565
data_list = list(data_iter)
2556-
conn.executemany(self.insert_statement(num_rows=1), data_list)
2566+
try:
2567+
conn.executemany(self.insert_statement(num_rows=1), data_list)
2568+
except Exception as exc:
2569+
raise DatabaseError("foo") from exc
25572570
return conn.rowcount
25582571

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

pandas/tests/io/test_sql.py

Lines changed: 1 addition & 11 deletions
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

0 commit comments

Comments
 (0)