@@ -38,7 +38,7 @@ def _is_sqlalchemy_engine(con):
38
38
try :
39
39
import sqlalchemy
40
40
_SQLALCHEMY_INSTALLED = True
41
-
41
+
42
42
from distutils .version import LooseVersion
43
43
ver = LooseVersion (sqlalchemy .__version__ )
44
44
# For sqlalchemy versions < 0.8.2, the BIGINT type is recognized
@@ -47,7 +47,7 @@ def _is_sqlalchemy_engine(con):
47
47
if ver < '0.8.2' :
48
48
from sqlalchemy import BigInteger
49
49
from sqlalchemy .ext .compiler import compiles
50
-
50
+
51
51
@compiles (BigInteger , 'sqlite' )
52
52
def compile_big_int_sqlite (type_ , compiler , ** kw ):
53
53
return 'INTEGER'
@@ -145,7 +145,7 @@ def _safe_fetch(cur):
145
145
if not isinstance (result , list ):
146
146
result = list (result )
147
147
return result
148
- except Exception as e : # pragma: no cover
148
+ except Exception as e : # pragma: no cover
149
149
excName = e .__class__ .__name__
150
150
if excName == 'OperationalError' :
151
151
return []
@@ -187,7 +187,7 @@ def tquery(sql, con=None, cur=None, retry=True):
187
187
con .commit ()
188
188
except Exception as e :
189
189
excName = e .__class__ .__name__
190
- if excName == 'OperationalError' : # pragma: no cover
190
+ if excName == 'OperationalError' : # pragma: no cover
191
191
print ('Failed to commit, may need to restart interpreter' )
192
192
else :
193
193
raise
@@ -199,7 +199,7 @@ def tquery(sql, con=None, cur=None, retry=True):
199
199
if result and len (result [0 ]) == 1 :
200
200
# python 3 compat
201
201
result = list (lzip (* result )[0 ])
202
- elif result is None : # pragma: no cover
202
+ elif result is None : # pragma: no cover
203
203
result = []
204
204
205
205
return result
@@ -253,7 +253,7 @@ def uquery(sql, con=None, cur=None, retry=True, params=None):
253
253
#------------------------------------------------------------------------------
254
254
#--- Read and write to DataFrames
255
255
256
- def read_sql_table (table_name , con , index_col = None , coerce_float = True ,
256
+ def read_sql_table (table_name , con , schema = None , index_col = None , coerce_float = True ,
257
257
parse_dates = None , columns = None ):
258
258
"""Read SQL database table into a DataFrame.
259
259
@@ -266,6 +266,7 @@ def read_sql_table(table_name, con, index_col=None, coerce_float=True,
266
266
Name of SQL table in database
267
267
con : SQLAlchemy engine
268
268
Sqlite DBAPI connection mode not supported
269
+ schema : Name of SQL schema in database.
269
270
index_col : string, optional
270
271
Column to set as index
271
272
coerce_float : boolean, default True
@@ -300,14 +301,14 @@ def read_sql_table(table_name, con, index_col=None, coerce_float=True,
300
301
from sqlalchemy .schema import MetaData
301
302
meta = MetaData (con )
302
303
try :
303
- meta .reflect (only = [table_name ])
304
+ meta .reflect (only = [table_name ], schema = schema )
304
305
except sqlalchemy .exc .InvalidRequestError :
305
306
raise ValueError ("Table %s not found" % table_name )
306
307
307
308
pandas_sql = PandasSQLAlchemy (con , meta = meta )
308
309
table = pandas_sql .read_table (
309
310
table_name , index_col = index_col , coerce_float = coerce_float ,
310
- parse_dates = parse_dates , columns = columns )
311
+ parse_dates = parse_dates , columns = columns , schema = schema )
311
312
312
313
if table is not None :
313
314
return table
@@ -437,8 +438,8 @@ def read_sql(sql, con, index_col=None, coerce_float=True, params=None,
437
438
coerce_float = coerce_float , parse_dates = parse_dates )
438
439
439
440
440
- def to_sql (frame , name , con , flavor = 'sqlite' , if_exists = 'fail' , index = True ,
441
- index_label = None , chunksize = None ):
441
+ def to_sql (frame , name , con , flavor = 'sqlite' , schema = None , if_exists = 'fail' ,
442
+ index = True , index_label = None , chunksize = None ):
442
443
"""
443
444
Write records stored in a DataFrame to a SQL database.
444
445
@@ -455,6 +456,7 @@ def to_sql(frame, name, con, flavor='sqlite', if_exists='fail', index=True,
455
456
The flavor of SQL to use. Ignored when using SQLAlchemy engine.
456
457
'mysql' is deprecated and will be removed in future versions, but it
457
458
will be further supported through SQLAlchemy engines.
459
+ schema : Name of SQL schema in database.
458
460
if_exists : {'fail', 'replace', 'append'}, default 'fail'
459
461
- fail: If table exists, do nothing.
460
462
- replace: If table exists, drop it, recreate it, and insert data.
@@ -481,10 +483,11 @@ def to_sql(frame, name, con, flavor='sqlite', if_exists='fail', index=True,
481
483
raise NotImplementedError
482
484
483
485
pandas_sql .to_sql (frame , name , if_exists = if_exists , index = index ,
484
- index_label = index_label , chunksize = chunksize )
486
+ index_label = index_label , schema = schema ,
487
+ chunksize = chunksize )
485
488
486
489
487
- def has_table (table_name , con , flavor = 'sqlite' ):
490
+ def has_table (table_name , con , flavor = 'sqlite' , schema = None ):
488
491
"""
489
492
Check if DataBase has named table.
490
493
@@ -500,13 +503,14 @@ def has_table(table_name, con, flavor='sqlite'):
500
503
The flavor of SQL to use. Ignored when using SQLAlchemy engine.
501
504
'mysql' is deprecated and will be removed in future versions, but it
502
505
will be further supported through SQLAlchemy engines.
506
+ schema : Name of SQL schema in database.
503
507
504
508
Returns
505
509
-------
506
510
boolean
507
511
"""
508
512
pandas_sql = pandasSQL_builder (con , flavor = flavor )
509
- return pandas_sql .has_table (table_name )
513
+ return pandas_sql .has_table (table_name , schema = schema )
510
514
511
515
table_exists = has_table
512
516
@@ -540,24 +544,26 @@ class PandasSQLTable(PandasObject):
540
544
"""
541
545
# TODO: support for multiIndex
542
546
def __init__ (self , name , pandas_sql_engine , frame = None , index = True ,
543
- if_exists = 'fail' , prefix = 'pandas' , index_label = None ):
547
+ if_exists = 'fail' , prefix = 'pandas' , index_label = None ,
548
+ schema = None ):
544
549
self .name = name
545
550
self .pd_sql = pandas_sql_engine
546
551
self .prefix = prefix
547
552
self .frame = frame
548
553
self .index = self ._index_name (index , index_label )
554
+ self .schema = schema
549
555
550
556
if frame is not None :
551
557
# We want to write a frame
552
- if self .pd_sql .has_table (self .name ):
558
+ if self .pd_sql .has_table (self .name , self . schema ):
553
559
if if_exists == 'fail' :
554
560
raise ValueError ("Table '%s' already exists." % name )
555
561
elif if_exists == 'replace' :
556
- self .pd_sql .drop_table (self .name )
562
+ self .pd_sql .drop_table (self .name , self . schema )
557
563
self .table = self ._create_table_statement ()
558
564
self .create ()
559
565
elif if_exists == 'append' :
560
- self .table = self .pd_sql .get_table (self .name )
566
+ self .table = self .pd_sql .get_table (self .name , self . schema )
561
567
if self .table is None :
562
568
self .table = self ._create_table_statement ()
563
569
else :
@@ -568,13 +574,13 @@ def __init__(self, name, pandas_sql_engine, frame=None, index=True,
568
574
self .create ()
569
575
else :
570
576
# no data provided, read-only mode
571
- self .table = self .pd_sql .get_table (self .name )
577
+ self .table = self .pd_sql .get_table (self .name , self . schema )
572
578
573
579
if self .table is None :
574
580
raise ValueError ("Could not init table '%s'" % name )
575
581
576
582
def exists (self ):
577
- return self .pd_sql .has_table (self .name )
583
+ return self .pd_sql .has_table (self .name , self . schema )
578
584
579
585
def sql_schema (self ):
580
586
from sqlalchemy .schema import CreateTable
@@ -709,7 +715,7 @@ def _create_table_statement(self):
709
715
columns = [Column (name , typ )
710
716
for name , typ in column_names_and_types ]
711
717
712
- return Table (self .name , self .pd_sql .meta , * columns )
718
+ return Table (self .name , self .pd_sql .meta , * columns , schema = self . schema )
713
719
714
720
def _harmonize_columns (self , parse_dates = None ):
715
721
""" Make a data_frame's column type align with an sql_table
@@ -843,9 +849,10 @@ def execute(self, *args, **kwargs):
843
849
return self .engine .execute (* args , ** kwargs )
844
850
845
851
def read_table (self , table_name , index_col = None , coerce_float = True ,
846
- parse_dates = None , columns = None ):
852
+ parse_dates = None , columns = None , schema = None ):
847
853
848
- table = PandasSQLTable (table_name , self , index = index_col )
854
+ table = PandasSQLTable (
855
+ table_name , self , index = index_col , schema = schema )
849
856
return table .read (coerce_float = coerce_float ,
850
857
parse_dates = parse_dates , columns = columns )
851
858
@@ -868,26 +875,29 @@ def read_sql(self, sql, index_col=None, coerce_float=True,
868
875
return data_frame
869
876
870
877
def to_sql (self , frame , name , if_exists = 'fail' , index = True ,
871
- index_label = None , chunksize = None ):
878
+ index_label = None , schema = None , chunksize = None ):
872
879
table = PandasSQLTable (
873
880
name , self , frame = frame , index = index , if_exists = if_exists ,
874
- index_label = index_label )
881
+ index_label = index_label , schema = schema )
875
882
table .insert (chunksize )
876
883
877
884
@property
878
885
def tables (self ):
879
886
return self .meta .tables
880
887
881
- def has_table (self , name ):
882
- return self .engine .has_table (name )
888
+ def has_table (self , name , schema = None ):
889
+ return self .engine .has_table (name , schema )
883
890
884
- def get_table (self , table_name ):
885
- return self .meta .tables .get (table_name )
891
+ def get_table (self , table_name , schema = None ):
892
+ if schema :
893
+ return self .meta .tables .get ('.' .join ([schema , table_name ]))
894
+ else :
895
+ return self .meta .tables .get (table_name )
886
896
887
- def drop_table (self , table_name ):
888
- if self .engine .has_table (table_name ):
889
- self .meta .reflect (only = [table_name ])
890
- self .get_table (table_name ).drop ()
897
+ def drop_table (self , table_name , schema = None ):
898
+ if self .engine .has_table (table_name , schema ):
899
+ self .meta .reflect (only = [table_name ], schema = schema )
900
+ self .get_table (table_name , schema ).drop ()
891
901
self .meta .clear ()
892
902
893
903
def _create_sql_schema (self , frame , table_name ):
0 commit comments