fly*_*all 14 python sqlalchemy pandas
我有一个动态创建的pandas数据框,其列名不同.我想他们推到SQL,但不希望他们去了MSSQLServer的默认数据类型"文本"(任何人都可以解释为什么这是默认?那岂不是有意义的使用更常见的数据类型? )
有谁知道如何为所有列指定数据类型?
column_errors.to_sql('load_errors',push_conn, if_exists = 'append', index = False, dtype = #Data type for all columns#)
Run Code Online (Sandbox Code Playgroud)
dtype参数采用dict,因为我不知道列是什么,所以很难将它们全部设置为'sqlalchemy.types.NVARCHAR'
这就是我想做的事情:
column_errors.to_sql('load_errors',push_conn, if_exists = 'append', index = False, dtype = 'sqlalchemy.types.NVARCHAR')
Run Code Online (Sandbox Code Playgroud)
任何帮助/理解如何最好地指定所有列类型将不胜感激!
jor*_*ris 23
如果您事先不知道列名,则可以动态创建此dict:
from sqlalchemy.types import NVARCHAR
df.to_sql(...., dtype={col_name: NVARCHAR for col_name in df})
Run Code Online (Sandbox Code Playgroud)
请注意,您必须传递sqlalchemy类型对象本身(或指定参数的实例NVARCHAR(length=10)
)而不是示例中的字符串.
Par*_*ait 23
要使用dtype,请使用相应的sqlalchemy类型传递键入每个数据框列的字典.将密钥更改为实际数据框列名称:
import sqlalchemy
import pandas as pd
...
column_errors.to_sql('load_errors',push_conn,
if_exists = 'append',
index = False,
dtype={'datefld': sqlalchemy.DateTime(),
'intfld': sqlalchemy.types.INTEGER(),
'strfld': sqlalchemy.types.NVARCHAR(length=255)
'floatfld': sqlalchemy.types.Float(precision=3, asdecimal=True)
'booleanfld': sqlalchemy.types.Boolean})
Run Code Online (Sandbox Code Playgroud)
如果您dtype
事先不知道列名称或类型,您甚至可以动态创建此字典:
def sqlcol(dfparam):
dtypedict = {}
for i,j in zip(dfparam.columns, dfparam.dtypes):
if "object" in str(j):
dtypedict.update({i: sqlalchemy.types.NVARCHAR(length=255)})
if "datetime" in str(j):
dtypedict.update({i: sqlalchemy.types.DateTime()})
if "float" in str(j):
dtypedict.update({i: sqlalchemy.types.Float(precision=3, asdecimal=True)})
if "int" in str(j):
dtypedict.update({i: sqlalchemy.types.INT()})
return dtypedict
outputdict = sqlcol(df)
column_errors.to_sql('load_errors',
push_conn,
if_exists = 'append',
index = False,
dtype = outputdict)
Run Code Online (Sandbox Code Playgroud)