Python pandas to_sql所有列均为nvarchar

Python pandas to_sql所有列均为nvarchar,python,pandas,sqlalchemy,Python,Pandas,Sqlalchemy,我有一个pandas数据框架,它是动态创建的,列名称各不相同。我试图将它们推送到sql,但不希望它们作为默认数据类型“text”转到mssqlserver(有人能解释为什么这是默认的吗?使用更常见的数据类型难道没有意义吗?) 有人知道如何为所有列指定数据类型吗 column_errors.to_sql('load_errors',push_conn, if_exists = 'append', index = False, dtype = #Data type for all columns#)

我有一个pandas数据框架,它是动态创建的,列名称各不相同。我试图将它们推送到sql,但不希望它们作为默认数据类型“text”转到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')

如果您能帮助/理解如何最好地指定所有列类型,我们将不胜感激

如果您事先不知道列名,可以动态创建此目录:

from sqlalchemy.types import NVARCHAR
df.to_sql(...., dtype={col_name: NVARCHAR for col_name in df})
请注意,您必须传递sqlalchemy类型对象本身(或用于指定参数的实例,如
NVARCHAR(length=10)
),而不是像示例中那样传递字符串。

若要使用,请传递一个为每个数据帧列键入的字典,其中包含相应的字符串。将键更改为实际数据框列名:

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)

谢谢,这是可行的,但我希望在我已经使用的单个to_sql命令中有一个更简单的方法来完成。非常有用的可能值得编辑NVARCHAR类型to VARCHAR或在postgres sql中工作的东西?谢谢,很好的解决方法-我应该想到这一点!希望有一个本机函数可以做到这一点-如果dtype参数将传递的类型识别为所有列的dtype,而dict用于所提到的特定列,那就太好了。@flyingmeatball,我想这很难添加,我打开了一个增强请求:@joris为什么
NVARCHAR
而不是
VARCHAR
在这里?@David542这是最初的问题,请参见此处,以了解两者之间差异的解释:对于那些现在在谷歌上搜索它的人,我想提到的是,这种理想的语法是implemented@Liza,你能指出它是如何实现的以及如何使用它吗?“数据类型:single SQLtype或dict of column name to SQL type,default None可选指定列的数据类型。SQL类型应为SQLAlchemy类型,或sqlite3回退连接的字符串。如果所有列的类型相同,则可以使用一个值。”可在源代码中找到。如果我是正确的,它可以完全按照问题演示的那样使用:dtype='sqlalchemy.types.NVARCHAR'