@@ -516,7 +516,8 @@ def read_sql(sql, con, index_col=None, coerce_float=True, params=None,
516
516
517
517
518
518
def to_sql (frame , name , con , flavor = 'sqlite' , schema = None , if_exists = 'fail' ,
519
- index = True , index_label = None , chunksize = None , dtype = None ):
519
+ index = True , index_label = None , chunksize = None , dtype = None ,
520
+ indexes = None ):
520
521
"""
521
522
Write records stored in a DataFrame to a SQL database.
522
523
@@ -568,7 +569,7 @@ def to_sql(frame, name, con, flavor='sqlite', schema=None, if_exists='fail',
568
569
569
570
pandas_sql .to_sql (frame , name , if_exists = if_exists , index = index ,
570
571
index_label = index_label , schema = schema ,
571
- chunksize = chunksize , dtype = dtype )
572
+ chunksize = chunksize , dtype = dtype , indexes = indexes )
572
573
573
574
574
575
def has_table (table_name , con , flavor = 'sqlite' , schema = None ):
@@ -653,12 +654,13 @@ class SQLTable(PandasObject):
653
654
654
655
def __init__ (self , name , pandas_sql_engine , frame = None , index = True ,
655
656
if_exists = 'fail' , prefix = 'pandas' , index_label = None ,
656
- schema = None , keys = None , dtype = None ):
657
+ schema = None , keys = None , dtype = None , indexes = None ):
657
658
self .name = name
658
659
self .pd_sql = pandas_sql_engine
659
660
self .prefix = prefix
660
661
self .frame = frame
661
662
self .index = self ._index_name (index , index_label )
663
+ self .indexes = indexes
662
664
self .schema = schema
663
665
self .if_exists = if_exists
664
666
self .keys = keys
@@ -849,18 +851,33 @@ def _index_name(self, index, index_label):
849
851
else :
850
852
return None
851
853
854
+ def _is_column_indexed (self , label ):
855
+ if self .indexes is not None and label in self .indexes :
856
+ return True
857
+
858
+ if self .index is not None and label in self .index :
859
+ if self .keys is None :
860
+ return True
861
+
862
+ col_nr = self .index .index (label ) + 1
863
+ if self .keys [:col_nr ] != self .index [:col_nr ]:
864
+ return True
865
+
866
+ return False
867
+
852
868
def _get_column_names_and_types (self , dtype_mapper ):
853
869
column_names_and_types = []
854
870
if self .index is not None :
855
871
for i , idx_label in enumerate (self .index ):
856
872
idx_type = dtype_mapper (
857
873
self .frame .index .get_level_values (i ))
858
- column_names_and_types .append ((idx_label , idx_type , True ))
874
+ indexed = self ._is_column_indexed (idx_label )
875
+ column_names_and_types .append ((idx_label , idx_type , indexed ))
859
876
860
877
column_names_and_types += [
861
878
(text_type (self .frame .columns [i ]),
862
879
dtype_mapper (self .frame .iloc [:, i ]),
863
- False )
880
+ self . _is_column_indexed ( text_type ( self . frame . columns [ i ])) )
864
881
for i in range (len (self .frame .columns ))
865
882
]
866
883
@@ -1205,7 +1222,8 @@ def read_query(self, sql, index_col=None, coerce_float=True,
1205
1222
read_sql = read_query
1206
1223
1207
1224
def to_sql (self , frame , name , if_exists = 'fail' , index = True ,
1208
- index_label = None , schema = None , chunksize = None , dtype = None ):
1225
+ index_label = None , schema = None , chunksize = None , dtype = None ,
1226
+ indexes = None ):
1209
1227
"""
1210
1228
Write records stored in a DataFrame to a SQL database.
1211
1229
@@ -1245,7 +1263,7 @@ def to_sql(self, frame, name, if_exists='fail', index=True,
1245
1263
1246
1264
table = SQLTable (name , self , frame = frame , index = index ,
1247
1265
if_exists = if_exists , index_label = index_label ,
1248
- schema = schema , dtype = dtype )
1266
+ schema = schema , dtype = dtype , indexes = indexes )
1249
1267
table .create ()
1250
1268
table .insert (chunksize )
1251
1269
if (not name .isdigit () and not name .islower ()):
@@ -1620,7 +1638,8 @@ def _fetchall_as_list(self, cur):
1620
1638
return result
1621
1639
1622
1640
def to_sql (self , frame , name , if_exists = 'fail' , index = True ,
1623
- index_label = None , schema = None , chunksize = None , dtype = None ):
1641
+ index_label = None , schema = None , chunksize = None , dtype = None ,
1642
+ indexes = None ):
1624
1643
"""
1625
1644
Write records stored in a DataFrame to a SQL database.
1626
1645
@@ -1657,7 +1676,7 @@ def to_sql(self, frame, name, if_exists='fail', index=True,
1657
1676
1658
1677
table = SQLiteTable (name , self , frame = frame , index = index ,
1659
1678
if_exists = if_exists , index_label = index_label ,
1660
- dtype = dtype )
1679
+ dtype = dtype , indexes = indexes )
1661
1680
table .create ()
1662
1681
table .insert (chunksize )
1663
1682
0 commit comments