From c39ef70aa457dcfcf8ddcf61f89dd69d55307744 Mon Sep 17 00:00:00 2001 From: Jon Luo <20971593+jzluo@users.noreply.github.com> Date: Fri, 17 Feb 2023 16:39:44 -0500 Subject: [PATCH] fix for database compatibility when getting table DDL (#1129) #1081 introduced a method to get DDL (table definitions) in a manner specific to sqlite3, thus breaking compatibility with other non-sqlite3 databases. This uses the sqlite3 command if the detected dialect is sqlite, and otherwise uses the standard SQL `SHOW CREATE TABLE`. This should fix #1103. --- langchain/sql_database.py | 33 ++++++++++++++++++++++----------- 1 file changed, 22 insertions(+), 11 deletions(-) diff --git a/langchain/sql_database.py b/langchain/sql_database.py index 078c527463b..c23d6ab6b94 100644 --- a/langchain/sql_database.py +++ b/langchain/sql_database.py @@ -96,22 +96,33 @@ class SQLDatabase: tables = [] for table_name in all_table_names: columns = [] - create_table = self.run( - ( - "SELECT sql FROM sqlite_master WHERE " - f"type='table' AND name='{table_name}'" - ), - fetch="one", - ) + if self.dialect in ("sqlite", "duckdb"): + create_table = self.run( + ( + "SELECT sql FROM sqlite_master WHERE " + f"type='table' AND name='{table_name}'" + ), + fetch="one", + ) + else: + create_table = self.run( + f"SHOW CREATE TABLE `{table_name}`;", + ) for column in self._inspector.get_columns(table_name, schema=self._schema): columns.append(column["name"]) if self._sample_rows_in_table_info: - select_star = ( - f"SELECT * FROM '{table_name}' LIMIT " - f"{self._sample_rows_in_table_info}" - ) + if self.dialect in ("sqlite", "duckdb"): + select_star = ( + f"SELECT * FROM '{table_name}' LIMIT " + f"{self._sample_rows_in_table_info}" + ) + else: + select_star = ( + f"SELECT * FROM `{table_name}` LIMIT " + f"{self._sample_rows_in_table_info}" + ) sample_rows = self.run(select_star)