diff --git a/libs/langchain/langchain/utilities/sql_database.py b/libs/langchain/langchain/utilities/sql_database.py index cd5af96b91e..e1f48c0ba48 100644 --- a/libs/langchain/langchain/utilities/sql_database.py +++ b/libs/langchain/langchain/utilities/sql_database.py @@ -388,16 +388,22 @@ class SQLDatabase: if self._schema is not None: if self.dialect == "snowflake": connection.exec_driver_sql( - f"ALTER SESSION SET search_path='{self._schema}'" + "ALTER SESSION SET search_path = %s", (self._schema,) ) elif self.dialect == "bigquery": - connection.exec_driver_sql(f"SET @@dataset_id='{self._schema}'") + connection.exec_driver_sql("SET @@dataset_id=?", (self._schema,)) elif self.dialect == "mssql": pass elif self.dialect == "trino": - connection.exec_driver_sql(f"USE {self._schema}") - else: # postgresql and compatible dialects + connection.exec_driver_sql("USE ?", (self._schema,)) + elif self.dialect == "duckdb": + # Unclear which parameterized argument syntax duckdb supports. + # The docs for the duckdb client say they support multiple, + # but `duckdb_engine` seemed to struggle with all of them: + # https://github.com/Mause/duckdb_engine/issues/796 connection.exec_driver_sql(f"SET search_path TO {self._schema}") + else: # postgresql and other compatible dialects + connection.exec_driver_sql("SET search_path TO %s", (self._schema,)) cursor = connection.execute(text(command)) if cursor.returns_rows: if fetch == "all": diff --git a/libs/langchain/poetry.lock b/libs/langchain/poetry.lock index e3955d35213..b136d64d99e 100644 --- a/libs/langchain/poetry.lock +++ b/libs/langchain/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.5.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.6.1 and should not be changed by hand. [[package]] name = "absl-py" @@ -2111,18 +2111,17 @@ files = [ [[package]] name = "duckdb-engine" -version = "0.7.3" +version = "0.9.2" description = "SQLAlchemy driver for duckdb" optional = false python-versions = ">=3.7" files = [ - {file = "duckdb_engine-0.7.3-py3-none-any.whl", hash = "sha256:b2dffe1607e87c6bc9d2afd4c43f53f9fc45add8b3c86d276ccbf6ae16cbfcca"}, - {file = "duckdb_engine-0.7.3.tar.gz", hash = "sha256:a4da04ae3e6bbce8af611b17e09b15212107c8f7871b876a358edfed313ad27d"}, + {file = "duckdb_engine-0.9.2-py3-none-any.whl", hash = "sha256:764e83dfb37e2f0ce6afcb8e701299e7b28060a40fdae86cfd7f08e0fca4496a"}, + {file = "duckdb_engine-0.9.2.tar.gz", hash = "sha256:efcd7b468f9b17e4480a97f0c60eade25cc081e8cfc04c46d63828677964b48f"}, ] [package.dependencies] duckdb = ">=0.4.0" -numpy = "*" sqlalchemy = ">=1.3.22" [[package]] @@ -3671,6 +3670,7 @@ optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, !=3.6.*" files = [ {file = "jsonpointer-2.4-py2.py3-none-any.whl", hash = "sha256:15d51bba20eea3165644553647711d150376234112651b4f1811022aecad7d7a"}, + {file = "jsonpointer-2.4.tar.gz", hash = "sha256:585cee82b70211fa9e6043b7bb89db6e1aa49524340dde8ad6b63206ea689d88"}, ] [[package]] @@ -5842,7 +5842,7 @@ files = [ [package.dependencies] numpy = [ {version = ">=1.20.3", markers = "python_version < \"3.10\""}, - {version = ">=1.21.0", markers = "python_version >= \"3.10\""}, + {version = ">=1.21.0", markers = "python_version >= \"3.10\" and python_version < \"3.11\""}, {version = ">=1.23.2", markers = "python_version >= \"3.11\""}, ] python-dateutil = ">=2.8.2" @@ -8802,7 +8802,7 @@ files = [ ] [package.dependencies] -greenlet = {version = "!=0.4.17", markers = "platform_machine == \"win32\" or platform_machine == \"WIN32\" or platform_machine == \"AMD64\" or platform_machine == \"amd64\" or platform_machine == \"x86_64\" or platform_machine == \"ppc64le\" or platform_machine == \"aarch64\""} +greenlet = {version = "!=0.4.17", markers = "platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\""} typing-extensions = ">=4.2.0" [package.extras] @@ -10615,4 +10615,4 @@ text-helpers = ["chardet"] [metadata] lock-version = "2.0" python-versions = ">=3.8.1,<4.0" -content-hash = "cd1e7089bf95e9eb885c392790b2afa85168b3af8ee8227727f8a95a4b60419b" +content-hash = "d40457accab6666901b6d8c2fd0d911814ab8f28265637c189f2512e1496fd92" diff --git a/libs/langchain/pyproject.toml b/libs/langchain/pyproject.toml index f3d9f67cb72..c742753894a 100644 --- a/libs/langchain/pyproject.toml +++ b/libs/langchain/pyproject.toml @@ -143,7 +143,7 @@ anthropic = {version = "^0.3.11", optional = true} pytest = "^7.3.0" pytest-cov = "^4.0.0" pytest-dotenv = "^0.5.2" -duckdb-engine = "^0.7.0" +duckdb-engine = "^0.9.2" pytest-watcher = "^0.2.6" freezegun = "^1.2.2" responses = "^0.22.0" @@ -407,4 +407,4 @@ ignore-regex = '.*(Stati Uniti|Tense=Pres).*' # whats is a typo but used frequently in queries so kept as is # aapply - async apply # unsecure - typo but part of API, decided to not bother for now -ignore-words-list = 'momento,collison,ned,foor,reworkd,parth,whats,aapply,mysogyny,unsecure,damon,crate,aadd,symbl,precesses,accademia' \ No newline at end of file +ignore-words-list = 'momento,collison,ned,foor,reworkd,parth,whats,aapply,mysogyny,unsecure,damon,crate,aadd,symbl,precesses,accademia'