Skip to content

Commit 8e7f41f

Browse files
added schema attribute to all necessary functions
1 parent 9857a0e commit 8e7f41f

File tree

1 file changed

+40
-31
lines changed

1 file changed

+40
-31
lines changed

pandas/io/sql.py

Lines changed: 40 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ def _is_sqlalchemy_engine(con):
3737
try:
3838
import sqlalchemy
3939
_SQLALCHEMY_INSTALLED = True
40-
40+
4141
from distutils.version import LooseVersion
4242
ver = LooseVersion(sqlalchemy.__version__)
4343
# For sqlalchemy versions < 0.8.2, the BIGINT type is recognized
@@ -46,7 +46,7 @@ def _is_sqlalchemy_engine(con):
4646
if ver < '0.8.2':
4747
from sqlalchemy import BigInteger
4848
from sqlalchemy.ext.compiler import compiles
49-
49+
5050
@compiles(BigInteger, 'sqlite')
5151
def compile_big_int_sqlite(type_, compiler, **kw):
5252
return 'INTEGER'
@@ -144,7 +144,7 @@ def _safe_fetch(cur):
144144
if not isinstance(result, list):
145145
result = list(result)
146146
return result
147-
except Exception as e: # pragma: no cover
147+
except Exception as e: # pragma: no cover
148148
excName = e.__class__.__name__
149149
if excName == 'OperationalError':
150150
return []
@@ -186,7 +186,7 @@ def tquery(sql, con=None, cur=None, retry=True):
186186
con.commit()
187187
except Exception as e:
188188
excName = e.__class__.__name__
189-
if excName == 'OperationalError': # pragma: no cover
189+
if excName == 'OperationalError': # pragma: no cover
190190
print('Failed to commit, may need to restart interpreter')
191191
else:
192192
raise
@@ -198,7 +198,7 @@ def tquery(sql, con=None, cur=None, retry=True):
198198
if result and len(result[0]) == 1:
199199
# python 3 compat
200200
result = list(lzip(*result)[0])
201-
elif result is None: # pragma: no cover
201+
elif result is None: # pragma: no cover
202202
result = []
203203

204204
return result
@@ -253,7 +253,7 @@ def uquery(sql, con=None, cur=None, retry=True, params=None):
253253
#--- Read and write to DataFrames
254254

255255
def read_sql_table(table_name, con, index_col=None, coerce_float=True,
256-
parse_dates=None, columns=None):
256+
parse_dates=None, columns=None, schema=None):
257257
"""Read SQL database table into a DataFrame.
258258
259259
Given a table name and an SQLAlchemy engine, returns a DataFrame.
@@ -281,6 +281,7 @@ def read_sql_table(table_name, con, index_col=None, coerce_float=True,
281281
such as SQLite
282282
columns : list
283283
List of column names to select from sql table
284+
schema : Name of SQL schema in database.
284285
285286
Returns
286287
-------
@@ -299,14 +300,14 @@ def read_sql_table(table_name, con, index_col=None, coerce_float=True,
299300
from sqlalchemy.schema import MetaData
300301
meta = MetaData(con)
301302
try:
302-
meta.reflect(only=[table_name])
303+
meta.reflect(only=[table_name], schema=schema)
303304
except sqlalchemy.exc.InvalidRequestError:
304305
raise ValueError("Table %s not found" % table_name)
305306

306307
pandas_sql = PandasSQLAlchemy(con, meta=meta)
307308
table = pandas_sql.read_table(
308309
table_name, index_col=index_col, coerce_float=coerce_float,
309-
parse_dates=parse_dates, columns=columns)
310+
parse_dates=parse_dates, columns=columns, schema=schema)
310311

311312
if table is not None:
312313
return table
@@ -432,7 +433,7 @@ def read_sql(sql, con, index_col=None, coerce_float=True, params=None,
432433

433434

434435
def to_sql(frame, name, con, flavor='sqlite', if_exists='fail', index=True,
435-
index_label=None):
436+
index_label=None, schema=None):
436437
"""
437438
Write records stored in a DataFrame to a SQL database.
438439
@@ -459,6 +460,7 @@ def to_sql(frame, name, con, flavor='sqlite', if_exists='fail', index=True,
459460
Column label for index column(s). If None is given (default) and
460461
`index` is True, then the index names are used.
461462
A sequence should be given if the DataFrame uses MultiIndex.
463+
schema : Name of SQL schema in database.
462464
463465
"""
464466
if if_exists not in ('fail', 'replace', 'append'):
@@ -472,10 +474,10 @@ def to_sql(frame, name, con, flavor='sqlite', if_exists='fail', index=True,
472474
raise NotImplementedError
473475

474476
pandas_sql.to_sql(frame, name, if_exists=if_exists, index=index,
475-
index_label=index_label)
477+
index_label=index_label, schema=schema)
476478

477479

478-
def has_table(table_name, con, flavor='sqlite'):
480+
def has_table(table_name, con, flavor='sqlite', schema=None):
479481
"""
480482
Check if DataBase has named table.
481483
@@ -491,13 +493,14 @@ def has_table(table_name, con, flavor='sqlite'):
491493
The flavor of SQL to use. Ignored when using SQLAlchemy engine.
492494
'mysql' is deprecated and will be removed in future versions, but it
493495
will be further supported through SQLAlchemy engines.
496+
schema : Name of SQL schema in database.
494497
495498
Returns
496499
-------
497500
boolean
498501
"""
499502
pandas_sql = pandasSQL_builder(con, flavor=flavor)
500-
return pandas_sql.has_table(table_name)
503+
return pandas_sql.has_table(table_name, schema=schema)
501504

502505
table_exists = has_table
503506

@@ -531,24 +534,26 @@ class PandasSQLTable(PandasObject):
531534
"""
532535
# TODO: support for multiIndex
533536
def __init__(self, name, pandas_sql_engine, frame=None, index=True,
534-
if_exists='fail', prefix='pandas', index_label=None):
537+
if_exists='fail', prefix='pandas', index_label=None,
538+
schema=None):
535539
self.name = name
536540
self.pd_sql = pandas_sql_engine
537541
self.prefix = prefix
538542
self.frame = frame
539543
self.index = self._index_name(index, index_label)
544+
self.schema = schema
540545

541546
if frame is not None:
542547
# We want to write a frame
543-
if self.pd_sql.has_table(self.name):
548+
if self.pd_sql.has_table(self.name, self.schema):
544549
if if_exists == 'fail':
545550
raise ValueError("Table '%s' already exists." % name)
546551
elif if_exists == 'replace':
547-
self.pd_sql.drop_table(self.name)
552+
self.pd_sql.drop_table(self.name, self.schema)
548553
self.table = self._create_table_statement()
549554
self.create()
550555
elif if_exists == 'append':
551-
self.table = self.pd_sql.get_table(self.name)
556+
self.table = self.pd_sql.get_table(self.name, self.schema)
552557
if self.table is None:
553558
self.table = self._create_table_statement()
554559
else:
@@ -559,13 +564,13 @@ def __init__(self, name, pandas_sql_engine, frame=None, index=True,
559564
self.create()
560565
else:
561566
# no data provided, read-only mode
562-
self.table = self.pd_sql.get_table(self.name)
567+
self.table = self.pd_sql.get_table(self.name, self.schema)
563568

564569
if self.table is None:
565570
raise ValueError("Could not init table '%s'" % name)
566571

567572
def exists(self):
568-
return self.pd_sql.has_table(self.name)
573+
return self.pd_sql.has_table(self.name, self.schema)
569574

570575
def sql_schema(self):
571576
from sqlalchemy.schema import CreateTable
@@ -679,7 +684,7 @@ def _create_table_statement(self):
679684
self.frame.index.get_level_values(i))
680685
columns.insert(0, Column(idx_label, idx_type, index=True))
681686

682-
return Table(self.name, self.pd_sql.meta, *columns)
687+
return Table(self.name, self.pd_sql.meta, *columns, schema=self.schema)
683688

684689
def _harmonize_columns(self, parse_dates=None):
685690
""" Make a data_frame's column type align with an sql_table
@@ -810,9 +815,10 @@ def execute(self, *args, **kwargs):
810815
return self.engine.execute(*args, **kwargs)
811816

812817
def read_table(self, table_name, index_col=None, coerce_float=True,
813-
parse_dates=None, columns=None):
818+
parse_dates=None, columns=None, schema=None):
814819

815-
table = PandasSQLTable(table_name, self, index=index_col)
820+
table = PandasSQLTable(
821+
table_name, self, index=index_col, schema=schema)
816822
return table.read(coerce_float=coerce_float,
817823
parse_dates=parse_dates, columns=columns)
818824

@@ -835,26 +841,29 @@ def read_sql(self, sql, index_col=None, coerce_float=True,
835841
return data_frame
836842

837843
def to_sql(self, frame, name, if_exists='fail', index=True,
838-
index_label=None):
844+
index_label=None, schema=None):
839845
table = PandasSQLTable(
840846
name, self, frame=frame, index=index, if_exists=if_exists,
841-
index_label=index_label)
847+
index_label=index_label, schema=schema)
842848
table.insert()
843849

844850
@property
845851
def tables(self):
846852
return self.meta.tables
847853

848-
def has_table(self, name):
849-
return self.engine.has_table(name)
854+
def has_table(self, name, schema=None):
855+
return self.engine.has_table(name, schema)
850856

851-
def get_table(self, table_name):
852-
return self.meta.tables.get(table_name)
857+
def get_table(self, table_name, schema=None):
858+
if schema:
859+
return self.meta.tables.get('.'.join([schema, table_name]))
860+
else:
861+
return self.meta.tables.get(table_name)
853862

854-
def drop_table(self, table_name):
855-
if self.engine.has_table(table_name):
856-
self.meta.reflect(only=[table_name])
857-
self.get_table(table_name).drop()
863+
def drop_table(self, table_name, schema=None):
864+
if self.engine.has_table(table_name, schema):
865+
self.meta.reflect(only=[table_name], schema=schema)
866+
self.get_table(table_name, schema).drop()
858867
self.meta.clear()
859868

860869
def _create_sql_schema(self, frame, table_name):

0 commit comments

Comments
 (0)