Skip to content

Commit d760e69

Browse files
committed
fix(sqlalchemy): fix view creation with select stmts that have bind parameters
1 parent 4daadfb commit d760e69

File tree

2 files changed

+22
-10
lines changed

2 files changed

+22
-10
lines changed

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

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import contextlib
44
import getpass
55
from operator import methodcaller
6-
from typing import TYPE_CHECKING, Any, Literal
6+
from typing import TYPE_CHECKING, Any, Literal, Mapping
77

88
import sqlalchemy as sa
99

@@ -532,19 +532,25 @@ def _get_temp_view_definition(
532532
def _register_temp_view_cleanup(self, name: str, raw_name: str) -> None:
533533
pass
534534

535-
def _create_temp_view(
535+
def _get_compiled_statement(
536536
self,
537-
view: sa.Table,
538537
definition: sa.sql.Selectable,
539-
) -> None:
538+
name: str,
539+
compile_kwargs: Mapping[str, Any] | None = None,
540+
):
541+
if compile_kwargs is None:
542+
compile_kwargs = {}
543+
compiled = definition.compile(compile_kwargs=compile_kwargs)
544+
defn = self._get_temp_view_definition(name, definition=compiled)
545+
return defn, compiled.params
546+
547+
def _create_temp_view(self, view: sa.Table, definition: sa.sql.Selectable) -> None:
540548
raw_name = view.name
541549
if raw_name not in self._temp_views and raw_name in self.list_tables():
542550
raise ValueError(f"{raw_name} already exists as a table or view")
543-
544-
name = self.con.dialect.identifier_preparer.quote_identifier(raw_name)
545-
compiled = definition.compile()
546-
defn = self._get_temp_view_definition(name, definition=compiled)
547-
query = sa.text(defn).bindparams(**compiled.params)
548-
self.con.execute(query)
551+
name = self.con.dialect.identifier_preparer.quote_identifier(view.name)
552+
compiled, params = self._get_compiled_statement(definition, name)
553+
with self.begin() as con:
554+
con.execute(compiled, **params)
549555
self._temp_views.add(raw_name)
550556
self._register_temp_view_cleanup(name, raw_name)

ibis/backends/duckdb/__init__.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -529,3 +529,9 @@ def _get_temp_view_definition(
529529
definition: sa.sql.compiler.Compiled,
530530
) -> str:
531531
return f"CREATE OR REPLACE TEMPORARY VIEW {name} AS {definition}"
532+
533+
def _get_compiled_statement(self, view: sa.Table, definition: sa.sql.Selectable):
534+
# TODO: remove this once duckdb supports CTAS prepared statements
535+
return super()._get_compiled_statement(
536+
view, definition, compile_kwargs={"literal_binds": True}
537+
)

0 commit comments

Comments
 (0)