@@ -516,7 +516,8 @@ def read_sql(sql, con, index_col=None, coerce_float=True, params=None,
516516
517517
518518def 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 ):
520521 """
521522 Write records stored in a DataFrame to a SQL database.
522523
@@ -568,7 +569,7 @@ def to_sql(frame, name, con, flavor='sqlite', schema=None, if_exists='fail',
568569
569570 pandas_sql .to_sql (frame , name , if_exists = if_exists , index = index ,
570571 index_label = index_label , schema = schema ,
571- chunksize = chunksize , dtype = dtype )
572+ chunksize = chunksize , dtype = dtype , indexes = indexes )
572573
573574
574575def has_table (table_name , con , flavor = 'sqlite' , schema = None ):
@@ -653,12 +654,13 @@ class SQLTable(PandasObject):
653654
654655 def __init__ (self , name , pandas_sql_engine , frame = None , index = True ,
655656 if_exists = 'fail' , prefix = 'pandas' , index_label = None ,
656- schema = None , keys = None , dtype = None ):
657+ schema = None , keys = None , dtype = None , indexes = None ):
657658 self .name = name
658659 self .pd_sql = pandas_sql_engine
659660 self .prefix = prefix
660661 self .frame = frame
661662 self .index = self ._index_name (index , index_label )
663+ self .indexes = indexes
662664 self .schema = schema
663665 self .if_exists = if_exists
664666 self .keys = keys
@@ -849,18 +851,33 @@ def _index_name(self, index, index_label):
849851 else :
850852 return None
851853
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+
852868 def _get_column_names_and_types (self , dtype_mapper ):
853869 column_names_and_types = []
854870 if self .index is not None :
855871 for i , idx_label in enumerate (self .index ):
856872 idx_type = dtype_mapper (
857873 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 ))
859876
860877 column_names_and_types += [
861878 (text_type (self .frame .columns [i ]),
862879 dtype_mapper (self .frame .iloc [:, i ]),
863- False )
880+ self . _is_column_indexed ( text_type ( self . frame . columns [ i ])) )
864881 for i in range (len (self .frame .columns ))
865882 ]
866883
@@ -1205,7 +1222,8 @@ def read_query(self, sql, index_col=None, coerce_float=True,
12051222 read_sql = read_query
12061223
12071224 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 ):
12091227 """
12101228 Write records stored in a DataFrame to a SQL database.
12111229
@@ -1245,7 +1263,7 @@ def to_sql(self, frame, name, if_exists='fail', index=True,
12451263
12461264 table = SQLTable (name , self , frame = frame , index = index ,
12471265 if_exists = if_exists , index_label = index_label ,
1248- schema = schema , dtype = dtype )
1266+ schema = schema , dtype = dtype , indexes = indexes )
12491267 table .create ()
12501268 table .insert (chunksize )
12511269 if (not name .isdigit () and not name .islower ()):
@@ -1620,7 +1638,8 @@ def _fetchall_as_list(self, cur):
16201638 return result
16211639
16221640 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 ):
16241643 """
16251644 Write records stored in a DataFrame to a SQL database.
16261645
@@ -1657,7 +1676,7 @@ def to_sql(self, frame, name, if_exists='fail', index=True,
16571676
16581677 table = SQLiteTable (name , self , frame = frame , index = index ,
16591678 if_exists = if_exists , index_label = index_label ,
1660- dtype = dtype )
1679+ dtype = dtype , indexes = indexes )
16611680 table .create ()
16621681 table .insert (chunksize )
16631682
0 commit comments