@@ -908,7 +908,7 @@ def _sqlalchemy_type(self, col):
908908
909909 col_type = self ._get_notnull_col_dtype (col )
910910
911- from sqlalchemy .types import (BigInteger , Float , Text , Boolean ,
911+ from sqlalchemy .types import (BigInteger , Integer , Float , Text , Boolean ,
912912 DateTime , Date , Time )
913913
914914 if col_type == 'datetime64' or col_type == 'datetime' :
@@ -923,10 +923,15 @@ def _sqlalchemy_type(self, col):
923923 "database." , UserWarning )
924924 return BigInteger
925925 elif col_type == 'floating' :
926- return Float
926+ if col .dtype == 'float32' :
927+ return Float (precision = 23 )
928+ else :
929+ return Float (precision = 53 )
927930 elif col_type == 'integer' :
928- # TODO: Refine integer size.
929- return BigInteger
931+ if col .dtype == 'int32' :
932+ return Integer
933+ else :
934+ return BigInteger
930935 elif col_type == 'boolean' :
931936 return Boolean
932937 elif col_type == 'date' :
@@ -1187,9 +1192,17 @@ def has_table(self, name, schema=None):
11871192 def get_table (self , table_name , schema = None ):
11881193 schema = schema or self .meta .schema
11891194 if schema :
1190- return self .meta .tables .get ('.' .join ([schema , table_name ]))
1195+ tbl = self .meta .tables .get ('.' .join ([schema , table_name ]))
11911196 else :
1192- return self .meta .tables .get (table_name )
1197+ tbl = self .meta .tables .get (table_name )
1198+
1199+ # Avoid casting double-precision floats into decimals
1200+ from sqlalchemy import Numeric
1201+ for column in tbl .columns :
1202+ if isinstance (column .type , Numeric ):
1203+ column .type .asdecimal = False
1204+
1205+ return tbl
11931206
11941207 def drop_table (self , table_name , schema = None ):
11951208 schema = schema or self .meta .schema
@@ -1198,8 +1211,9 @@ def drop_table(self, table_name, schema=None):
11981211 self .get_table (table_name , schema ).drop ()
11991212 self .meta .clear ()
12001213
1201- def _create_sql_schema (self , frame , table_name , keys = None ):
1202- table = SQLTable (table_name , self , frame = frame , index = False , keys = keys )
1214+ def _create_sql_schema (self , frame , table_name , keys = None , dtype = None ):
1215+ table = SQLTable (table_name , self , frame = frame , index = False , keys = keys ,
1216+ dtype = dtype )
12031217 return str (table .sql_schema ())
12041218
12051219
@@ -1213,7 +1227,7 @@ def _create_sql_schema(self, frame, table_name, keys=None):
12131227 'sqlite' : 'TEXT' ,
12141228 },
12151229 'floating' : {
1216- 'mysql' : 'FLOAT ' ,
1230+ 'mysql' : 'DOUBLE ' ,
12171231 'sqlite' : 'REAL' ,
12181232 },
12191233 'integer' : {
@@ -1520,13 +1534,13 @@ def drop_table(self, name, schema=None):
15201534 drop_sql = "DROP TABLE %s" % name
15211535 self .execute (drop_sql )
15221536
1523- def _create_sql_schema (self , frame , table_name , keys = None ):
1537+ def _create_sql_schema (self , frame , table_name , keys = None , dtype = None ):
15241538 table = SQLiteTable (table_name , self , frame = frame , index = False ,
1525- keys = keys )
1539+ keys = keys , dtype = dtype )
15261540 return str (table .sql_schema ())
15271541
15281542
1529- def get_schema (frame , name , flavor = 'sqlite' , keys = None , con = None ):
1543+ def get_schema (frame , name , flavor = 'sqlite' , keys = None , con = None , dtype = None ):
15301544 """
15311545 Get the SQL db table schema for the given frame.
15321546
@@ -1545,11 +1559,14 @@ def get_schema(frame, name, flavor='sqlite', keys=None, con=None):
15451559 Using SQLAlchemy makes it possible to use any DB supported by that
15461560 library.
15471561 If a DBAPI2 object, only sqlite3 is supported.
1562+ dtype : dict of column name to SQL type, default None
1563+ Optional specifying the datatype for columns. The SQL type should
1564+ be a SQLAlchemy type, or a string for sqlite3 fallback connection.
15481565
15491566 """
15501567
15511568 pandas_sql = pandasSQL_builder (con = con , flavor = flavor )
1552- return pandas_sql ._create_sql_schema (frame , name , keys = keys )
1569+ return pandas_sql ._create_sql_schema (frame , name , keys = keys , dtype = dtype )
15531570
15541571
15551572# legacy names, with depreciation warnings and copied docs
0 commit comments