Skip to content

Commit 15d399e

Browse files
saulpwcpcloud
authored andcommitted
feat(insert): add support for list+dict to sqlalchemy backends
1 parent dbc54f8 commit 15d399e

2 files changed

Lines changed: 29 additions & 1 deletion

File tree

ibis/backends/base/sql/alchemy/__init__.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -429,7 +429,7 @@ def table(
429429
def insert(
430430
self,
431431
table_name: str,
432-
obj: pd.DataFrame | ir.Table,
432+
obj: pd.DataFrame | ir.Table | list | dict,
433433
database: str | None = None,
434434
overwrite: bool = False,
435435
) -> None:
@@ -496,6 +496,14 @@ def insert(
496496
from_table_expr.compile(),
497497
)
498498
)
499+
elif isinstance(obj, (list, dict)):
500+
to_table = self._get_sqla_table(table_name, schema=database)
501+
502+
with self.begin() as bind:
503+
if overwrite:
504+
bind.execute(to_table.delete())
505+
bind.execute(to_table.insert().values(obj))
506+
499507
else:
500508
raise ValueError(
501509
"No operation is being performed. Either the obj parameter "

ibis/backends/tests/test_client.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -327,6 +327,26 @@ def test_insert_overwrite_from_expr(
327327
tm.assert_frame_equal(result, from_table.execute())
328328

329329

330+
def test_insert_overwrite_from_list(
331+
alchemy_con,
332+
employee_data_1_temp_table,
333+
):
334+
def _emp(a, b, c, d):
335+
return dict(first_name=a, last_name=b, department_name=c, salary=d)
336+
337+
alchemy_con.insert(
338+
employee_data_1_temp_table,
339+
[
340+
_emp('Adam', 'Smith', 'Accounting', 50000.0),
341+
_emp('Mohammed', 'Ali', 'Boxing', 150000),
342+
_emp('María', 'Gonzalez', 'Engineering', 100000.0),
343+
],
344+
overwrite=True,
345+
)
346+
347+
assert len(alchemy_con.table(employee_data_1_temp_table).execute()) == 3
348+
349+
330350
def test_list_databases(alchemy_con):
331351
# Every backend has its own databases
332352
TEST_DATABASES = {

0 commit comments

Comments
 (0)