@@ -279,13 +279,9 @@ def read_sql_table(
279
279
--------
280
280
>>> pd.read_sql_table('table_name', 'postgres:///db_name') # doctest:+SKIP
281
281
"""
282
- from sqlalchemy .exc import InvalidRequestError
283
-
284
282
pandas_sql = pandasSQL_builder (con , schema = schema )
285
- try :
286
- pandas_sql .meta .reflect (only = [table_name ], views = True )
287
- except InvalidRequestError as err :
288
- raise ValueError (f"Table { table_name } not found" ) from err
283
+ if not pandas_sql .has_table (table_name ):
284
+ raise ValueError (f"Table { table_name } not found" )
289
285
290
286
table = pandas_sql .read_table (
291
287
table_name ,
@@ -580,7 +576,7 @@ def read_sql(
580
576
_is_table_name = False
581
577
582
578
if _is_table_name :
583
- pandas_sql .meta .reflect (only = [sql ])
579
+ pandas_sql .meta .reflect (bind = pandas_sql . connectable , only = [sql ])
584
580
return pandas_sql .read_table (
585
581
sql ,
586
582
index_col = index_col ,
@@ -803,7 +799,7 @@ def _execute_create(self):
803
799
self .table = self .table .to_metadata (self .pd_sql .meta )
804
800
else :
805
801
self .table = self .table .tometadata (self .pd_sql .meta )
806
- self .table .create ()
802
+ self .table .create (bind = self . pd_sql . connectable )
807
803
808
804
def create (self ):
809
805
if self .exists ():
@@ -842,8 +838,12 @@ def _execute_insert_multi(self, conn, keys: list[str], data_iter):
842
838
and tables containing a few columns
843
839
but performance degrades quickly with increase of columns.
844
840
"""
841
+
842
+ from sqlalchemy import insert
843
+
845
844
data = [dict (zip (keys , row )) for row in data_iter ]
846
- conn .execute (self .table .insert (data ))
845
+ stmt = insert (self .table ).values (data )
846
+ conn .execute (stmt )
847
847
848
848
def insert_data (self ):
849
849
if self .index is not None :
@@ -951,17 +951,16 @@ def _query_iterator(
951
951
yield self .frame
952
952
953
953
def read (self , coerce_float = True , parse_dates = None , columns = None , chunksize = None ):
954
+ from sqlalchemy import select
954
955
955
956
if columns is not None and len (columns ) > 0 :
956
- from sqlalchemy import select
957
-
958
957
cols = [self .table .c [n ] for n in columns ]
959
958
if self .index is not None :
960
959
for idx in self .index [::- 1 ]:
961
960
cols .insert (0 , self .table .c [idx ])
962
- sql_select = select (cols )
961
+ sql_select = select (* cols ) if _gt14 () else select ( cols )
963
962
else :
964
- sql_select = self .table .select ()
963
+ sql_select = select ( self . table ) if _gt14 () else self .table .select ()
965
964
966
965
result = self .pd_sql .execute (sql_select )
967
966
column_names = result .keys ()
@@ -1043,6 +1042,7 @@ def _create_table_setup(self):
1043
1042
PrimaryKeyConstraint ,
1044
1043
Table ,
1045
1044
)
1045
+ from sqlalchemy .schema import MetaData
1046
1046
1047
1047
column_names_and_types = self ._get_column_names_and_types (self ._sqlalchemy_type )
1048
1048
@@ -1063,10 +1063,7 @@ def _create_table_setup(self):
1063
1063
1064
1064
# At this point, attach to new metadata, only attach to self.meta
1065
1065
# once table is created.
1066
- from sqlalchemy .schema import MetaData
1067
-
1068
- meta = MetaData (self .pd_sql , schema = schema )
1069
-
1066
+ meta = MetaData ()
1070
1067
return Table (self .name , meta , * columns , schema = schema )
1071
1068
1072
1069
def _harmonize_columns (self , parse_dates = None ):
@@ -1355,15 +1352,19 @@ def __init__(self, engine, schema: str | None = None):
1355
1352
from sqlalchemy .schema import MetaData
1356
1353
1357
1354
self .connectable = engine
1358
- self .meta = MetaData (self .connectable , schema = schema )
1355
+ self .meta = MetaData (schema = schema )
1356
+ self .meta .reflect (bind = engine )
1359
1357
1360
1358
@contextmanager
1361
1359
def run_transaction (self ):
1362
- with self .connectable .begin () as tx :
1363
- if hasattr (tx , "execute" ):
1364
- yield tx
1365
- else :
1366
- yield self .connectable
1360
+ from sqlalchemy .engine import Engine
1361
+
1362
+ if isinstance (self .connectable , Engine ):
1363
+ with self .connectable .connect () as conn :
1364
+ with conn .begin ():
1365
+ yield conn
1366
+ else :
1367
+ yield self .connectable
1367
1368
1368
1369
def execute (self , * args , ** kwargs ):
1369
1370
"""Simple passthrough to SQLAlchemy connectable"""
@@ -1724,9 +1725,9 @@ def tables(self):
1724
1725
1725
1726
def has_table (self , name : str , schema : str | None = None ):
1726
1727
if _gt14 ():
1727
- import sqlalchemy as sa
1728
+ from sqlalchemy import inspect
1728
1729
1729
- insp = sa . inspect (self .connectable )
1730
+ insp = inspect (self .connectable )
1730
1731
return insp .has_table (name , schema or self .meta .schema )
1731
1732
else :
1732
1733
return self .connectable .run_callable (
@@ -1752,8 +1753,8 @@ def get_table(self, table_name: str, schema: str | None = None):
1752
1753
def drop_table (self , table_name : str , schema : str | None = None ):
1753
1754
schema = schema or self .meta .schema
1754
1755
if self .has_table (table_name , schema ):
1755
- self .meta .reflect (only = [table_name ], schema = schema )
1756
- self .get_table (table_name , schema ).drop ()
1756
+ self .meta .reflect (bind = self . connectable , only = [table_name ], schema = schema )
1757
+ self .get_table (table_name , schema ).drop (bind = self . connectable )
1757
1758
self .meta .clear ()
1758
1759
1759
1760
def _create_sql_schema (
0 commit comments