pandas to_sql所有列为nvarchar

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))而不是示例中的字符串.

  • 谢谢,很好的解决方法 - 我应该想到这一点!希望有一个本机函数来做到这一点 - 如果 dtype 参数将传递的类型识别为所有列的 dtype,而 dict 用于提到的特定列,那就太好了。 (2认同)

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)