@@ -566,17 +566,17 @@ def __init__(self, name, pandas_sql_engine, frame=None, index=True,
566566 raise ValueError ("Table '%s' already exists." % name )
567567 elif if_exists == 'replace' :
568568 self .pd_sql .drop_table (self .name , self .schema )
569- self .table = self ._create_table_statement ()
569+ self .table = self ._create_table_setup ()
570570 self .create ()
571571 elif if_exists == 'append' :
572572 self .table = self .pd_sql .get_table (self .name , self .schema )
573573 if self .table is None :
574- self .table = self ._create_table_statement ()
574+ self .table = self ._create_table_setup ()
575575 else :
576576 raise ValueError (
577577 "'{0}' is not valid for if_exists" .format (if_exists ))
578578 else :
579- self .table = self ._create_table_statement ()
579+ self .table = self ._create_table_setup ()
580580 self .create ()
581581 else :
582582 # no data provided, read-only mode
@@ -703,23 +703,25 @@ def _get_column_names_and_types(self, dtype_mapper):
703703 for i , idx_label in enumerate (self .index ):
704704 idx_type = dtype_mapper (
705705 self .frame .index .get_level_values (i ))
706- column_names_and_types .append ((idx_label , idx_type ))
706+ column_names_and_types .append ((idx_label , idx_type , True ))
707707
708708 column_names_and_types += [
709709 (str (self .frame .columns [i ]),
710- dtype_mapper (self .frame .iloc [:,i ]))
710+ dtype_mapper (self .frame .iloc [:,i ]),
711+ False )
711712 for i in range (len (self .frame .columns ))
712713 ]
714+
713715 return column_names_and_types
714716
715- def _create_table_statement (self ):
717+ def _create_table_setup (self ):
716718 from sqlalchemy import Table , Column
717719
718720 column_names_and_types = \
719721 self ._get_column_names_and_types (self ._sqlalchemy_type )
720722
721- columns = [Column (name , typ )
722- for name , typ in column_names_and_types ]
723+ columns = [Column (name , typ , index = is_index )
724+ for name , typ , is_index in column_names_and_types ]
723725
724726 return Table (self .name , self .pd_sql .meta , * columns , schema = self .schema )
725727
@@ -979,10 +981,12 @@ class PandasSQLTableLegacy(PandasSQLTable):
979981 Instead of a table variable just use the Create Table
980982 statement"""
981983 def sql_schema (self ):
982- return str (self .table )
984+ return str ("; \n " . join ( self .table ) )
983985
984986 def create (self ):
985- self .pd_sql .execute (self .table )
987+ with self .pd_sql .con :
988+ for stmt in self .table :
989+ self .pd_sql .execute (stmt )
986990
987991 def insert_statement (self ):
988992 names = list (map (str , self .frame .columns ))
@@ -1026,14 +1030,17 @@ def insert(self, chunksize=None):
10261030 cur .executemany (ins , data_list )
10271031 cur .close ()
10281032
1029- def _create_table_statement (self ):
1030- "Return a CREATE TABLE statement to suit the contents of a DataFrame."
1033+ def _create_table_setup (self ):
1034+ """Return a list of SQL statement that create a table reflecting the
1035+ structure of a DataFrame. The first entry will be a CREATE TABLE
1036+ statement while the rest will be CREATE INDEX statements
1037+ """
10311038
10321039 column_names_and_types = \
10331040 self ._get_column_names_and_types (self ._sql_type_name )
10341041
10351042 pat = re .compile ('\s+' )
1036- column_names = [col_name for col_name , _ in column_names_and_types ]
1043+ column_names = [col_name for col_name , _ , _ in column_names_and_types ]
10371044 if any (map (pat .search , column_names )):
10381045 warnings .warn (_SAFE_NAMES_WARNING )
10391046
@@ -1044,13 +1051,21 @@ def _create_table_statement(self):
10441051
10451052 col_template = br_l + '%s' + br_r + ' %s'
10461053
1047- columns = ',\n ' .join (col_template %
1048- x for x in column_names_and_types )
1054+ columns = ',\n ' .join (col_template % ( cname , ctype )
1055+ for cname , ctype , _ in column_names_and_types )
10491056 template = """CREATE TABLE %(name)s (
10501057 %(columns)s
10511058 )"""
1052- create_statement = template % {'name' : self .name , 'columns' : columns }
1053- return create_statement
1059+ create_stmts = [template % {'name' : self .name , 'columns' : columns }, ]
1060+
1061+ ix_tpl = "CREATE INDEX ix_{tbl}_{col} ON {tbl} ({br_l}{col}{br_r})"
1062+ for cname , _ , is_index in column_names_and_types :
1063+ if not is_index :
1064+ continue
1065+ create_stmts .append (ix_tpl .format (tbl = self .name , col = cname ,
1066+ br_l = br_l , br_r = br_r ))
1067+
1068+ return create_stmts
10541069
10551070 def _sql_type_name (self , col ):
10561071 pytype = col .dtype .type
0 commit comments