pandas 将所有列作为nvarchar传送到_sql

wooyq4lh  于 2023-03-16  发布在  其他
关注(0)|答案(3)|浏览(114)

我有一个动态创建的panda数据框,它的列名是可变的,我试图将它们推送到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')

任何帮助/了解如何最好地指定所有列类型将不胜感激!

km0tfn4u

km0tfn4u1#

要使用dtype,请传递一个字典,该字典将键控到具有相应sqlalchemy types的每个数据框列。将键控更改为实际的数据框列名:

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)
2sbarzqh

2sbarzqh2#

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

from sqlalchemy.types import NVARCHAR
df.to_sql(...., dtype={col_name: NVARCHAR for col_name in df})

注意,必须传递sqlalchemy类型对象本身(或者一个示例来指定NVARCHAR(length=10)之类的参数),而不是像示例中那样传递字符串。

zqdjd7g9

zqdjd7g93#

Python有一个非常通用的集合库,defaultdict类允许我们动态地指定--通过一个lambda表达式--当键丢失时应该返回什么值。
在您的示例中使用以下内容:

from sqlalchemy.types import NVARCHAR
from collections import defaultdict
always_nvarchar = defaultdict(lambda: NVARCHAR(length=255))
# ...
column_errors.to_sql('load_errors',push_conn, if_exists = 'append', index = False, dtype = always_nvarchar)

相关问题