7
7
8
8
import warnings
9
9
import itertools
10
+ import re
10
11
import numpy as np
11
12
12
13
import pandas .core .common as com
@@ -38,11 +39,6 @@ def _convert_params(sql, params):
38
39
return args
39
40
40
41
41
- def _safe_col_name (col_name ):
42
- #TODO: probably want to forbid database reserved names, such as "database"
43
- return col_name .strip ().replace (' ' , '_' )
44
-
45
-
46
42
def _handle_date_column (col , format = None ):
47
43
if isinstance (format , dict ):
48
44
return to_datetime (col , ** format )
@@ -587,11 +583,11 @@ def _index_name(self, index, index_label):
587
583
def _create_table_statement (self ):
588
584
from sqlalchemy import Table , Column
589
585
590
- safe_columns = map (_safe_col_name , self .frame .dtypes . index )
586
+ columns = list ( map (str , self .frame .columns ) )
591
587
column_types = map (self ._sqlalchemy_type , self .frame .dtypes )
592
588
593
589
columns = [Column (name , typ )
594
- for name , typ in zip (safe_columns , column_types )]
590
+ for name , typ in zip (columns , column_types )]
595
591
596
592
if self .index is not None :
597
593
for i , idx_label in enumerate (self .index [::- 1 ]):
@@ -836,6 +832,11 @@ def _create_sql_schema(self, frame, table_name):
836
832
}
837
833
838
834
835
+ _SAFE_NAMES_WARNING = ("The spaces in these column names will not be changed."
836
+ "In pandas versions < 0.14, spaces were converted to "
837
+ "underscores." )
838
+
839
+
839
840
class PandasSQLTableLegacy (PandasSQLTable ):
840
841
"""Patch the PandasSQLTable for legacy support.
841
842
Instead of a table variable just use the Create Table
@@ -847,19 +848,18 @@ def create(self):
847
848
self .pd_sql .execute (self .table )
848
849
849
850
def insert_statement (self ):
850
- # Replace spaces in DataFrame column names with _.
851
- safe_names = [_safe_col_name (n ) for n in self .frame .dtypes .index ]
851
+ names = list (map (str , self .frame .columns ))
852
852
flv = self .pd_sql .flavor
853
853
br_l = _SQL_SYMB [flv ]['br_l' ] # left val quote char
854
854
br_r = _SQL_SYMB [flv ]['br_r' ] # right val quote char
855
855
wld = _SQL_SYMB [flv ]['wld' ] # wildcard char
856
856
857
857
if self .index is not None :
858
- [safe_names .insert (0 , idx ) for idx in self .index [::- 1 ]]
858
+ [names .insert (0 , idx ) for idx in self .index [::- 1 ]]
859
859
860
- bracketed_names = [br_l + column + br_r for column in safe_names ]
860
+ bracketed_names = [br_l + column + br_r for column in names ]
861
861
col_names = ',' .join (bracketed_names )
862
- wildcards = ',' .join ([wld ] * len (safe_names ))
862
+ wildcards = ',' .join ([wld ] * len (names ))
863
863
insert_statement = 'INSERT INTO %s (%s) VALUES (%s)' % (
864
864
self .name , col_names , wildcards )
865
865
return insert_statement
@@ -881,13 +881,15 @@ def insert(self):
881
881
def _create_table_statement (self ):
882
882
"Return a CREATE TABLE statement to suit the contents of a DataFrame."
883
883
884
- # Replace spaces in DataFrame column names with _.
885
- safe_columns = [_safe_col_name (n ) for n in self .frame .dtypes .index ]
884
+ columns = list (map (str , self .frame .columns ))
885
+ pat = re .compile ('\s+' )
886
+ if any (map (pat .search , columns )):
887
+ warnings .warn (_SAFE_NAMES_WARNING )
886
888
column_types = [self ._sql_type_name (typ ) for typ in self .frame .dtypes ]
887
889
888
890
if self .index is not None :
889
891
for i , idx_label in enumerate (self .index [::- 1 ]):
890
- safe_columns .insert (0 , idx_label )
892
+ columns .insert (0 , idx_label )
891
893
column_types .insert (0 , self ._sql_type_name (self .frame .index .get_level_values (i ).dtype ))
892
894
893
895
flv = self .pd_sql .flavor
@@ -898,7 +900,7 @@ def _create_table_statement(self):
898
900
col_template = br_l + '%s' + br_r + ' %s'
899
901
900
902
columns = ',\n ' .join (col_template %
901
- x for x in zip (safe_columns , column_types ))
903
+ x for x in zip (columns , column_types ))
902
904
template = """CREATE TABLE %(name)s (
903
905
%(columns)s
904
906
)"""
0 commit comments