From 77312672eaa0571b44118b9d54bfcc5231cc91cb Mon Sep 17 00:00:00 2001 From: Fangchen Li Date: Fri, 14 Jan 2022 10:39:52 -0600 Subject: [PATCH 1/3] PERF: avoid SQL MetaData reflection in init #45260 --- pandas/io/sql.py | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/pandas/io/sql.py b/pandas/io/sql.py index 022ed2df8598d..ca7d7b8059c1a 100644 --- a/pandas/io/sql.py +++ b/pandas/io/sql.py @@ -1378,7 +1378,6 @@ def __init__(self, engine, schema: str | None = None): self.connectable = engine self.meta = MetaData(schema=schema) - self.meta.reflect(bind=engine) @contextmanager def run_transaction(self): @@ -1761,19 +1760,17 @@ def has_table(self, name: str, schema: str | None = None): ) def get_table(self, table_name: str, schema: str | None = None): - schema = schema or self.meta.schema - if schema: - tbl = self.meta.tables.get(".".join([schema, table_name])) - else: - tbl = self.meta.tables.get(table_name) - - # Avoid casting double-precision floats into decimals - from sqlalchemy import Numeric + from sqlalchemy import ( + Numeric, + Table, + ) + schema = schema or self.meta.schema + table_name = ".".join([schema, table_name]) if schema else table_name + tbl = Table(table_name, self.meta, autoload_with=self.connectable) for column in tbl.columns: if isinstance(column.type, Numeric): column.type.asdecimal = False - return tbl def drop_table(self, table_name: str, schema: str | None = None): From 8c2e4b0a936f168c13ba732cbf8802f9c365a06e Mon Sep 17 00:00:00 2001 From: Fangchen Li Date: Fri, 14 Jan 2022 11:52:55 -0600 Subject: [PATCH 2/3] fix schema --- pandas/io/sql.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/pandas/io/sql.py b/pandas/io/sql.py index ca7d7b8059c1a..f1af2ba920c75 100644 --- a/pandas/io/sql.py +++ b/pandas/io/sql.py @@ -1766,8 +1766,7 @@ def get_table(self, table_name: str, schema: str | None = None): ) schema = schema or self.meta.schema - table_name = ".".join([schema, table_name]) if schema else table_name - tbl = Table(table_name, self.meta, autoload_with=self.connectable) + tbl = Table(table_name, self.meta, autoload_with=self.connectable, schema=schema) for column in tbl.columns: if isinstance(column.type, Numeric): column.type.asdecimal = False From 1639bc70a647224e84e6a8f3454d0417dcb8e252 Mon Sep 17 00:00:00 2001 From: Fangchen Li Date: Fri, 14 Jan 2022 11:54:05 -0600 Subject: [PATCH 3/3] fix schema --- pandas/io/sql.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/pandas/io/sql.py b/pandas/io/sql.py index f1af2ba920c75..f7fdc47afa8d1 100644 --- a/pandas/io/sql.py +++ b/pandas/io/sql.py @@ -1766,7 +1766,9 @@ def get_table(self, table_name: str, schema: str | None = None): ) schema = schema or self.meta.schema - tbl = Table(table_name, self.meta, autoload_with=self.connectable, schema=schema) + tbl = Table( + table_name, self.meta, autoload_with=self.connectable, schema=schema + ) for column in tbl.columns: if isinstance(column.type, Numeric): column.type.asdecimal = False