我有一个动态创建的pandas数据框,其列名不同.我想他们推到SQL,但不希望他们去了MSSQLServer的默认数据类型"文本"(任何人都可以解释为什么这是默认?那岂不是有意义的使用更常见的数据类型? )
有谁知道如何为所有列指定数据类型?
column_errors.to_sql('load_errors',push_conn, if_exists = 'append', index = False, dtype = #Data type for all columns#)
dtype参数采用dict,因为我不知道列是什么,所以很难将它们全部设置为'sqlalchemy.types.NVARCHAR'
这就是我想做的事情:
column_errors.to_sql('load_errors',push_conn, if_exists = 'append', index = False, dtype = 'sqlalchemy.types.NVARCHAR')
任何帮助/理解如何最好地指定所有列类型将不胜感激!
如果您事先不知道列名,则可以动态创建此dict:
from sqlalchemy.types import NVARCHAR df.to_sql(...., dtype={col_name: NVARCHAR for col_name in df})
请注意,您必须传递sqlalchemy类型对象本身(或指定参数的实例NVARCHAR(length=10)
)而不是示例中的字符串.
要使用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})
如果您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)