【问题标题】:pandas to_sql all columns as nvarcharpandas to_sql 所有列都作为 nvarchar
【发布时间】:2016-03-26 18:41:48
【问题描述】:

我有一个 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')

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

【问题讨论】:

  • 对于那些正在谷歌搜索的人,我想提一下,这个理想的语法已经实现了
  • @Liza,你能指出它是如何实现的以及如何使用它吗?
  • github.com/pandas-dev/pandas/blob/… "dtype : 单个 SQLtype 或 dict of column name to SQL type, default None 可选的指定列的数据类型。SQL类型应该是SQLAlchemy类型,或者是sqlite3后备连接的字符串. 如果所有列的类型相同,则可以使用一个值。在源代码中找到。如果我是正确的,它可以完全按照问题所示使用:dtype = 'sqlalchemy.types.NVARCHAR'

标签: python pandas sqlalchemy


【解决方案1】:

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

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

请注意,您必须传递 sqlalchemy 类型对象本身(或指定参数的实例,如 NVARCHAR(length=10)),并且不是您的示例中的字符串。

【讨论】:

  • 谢谢,很好的解决方法 - 我应该想到这一点!希望有一个本机函数来做到这一点 - 如果 dtype 参数将传递的类型识别为所有列的 dtype,而 dict 用于提到的特定列,那就太好了。
  • @flyingmeatball 我觉得这很难添加,我打开了一个增强请求:github.com/pydata/pandas/issues/11886
  • @joris 为什么在这里NVARCHAR 而不是VARCHAR
  • @David542 这是最初的问题,请参阅此处以了解两者之间的区别:stackoverflow.com/questions/144283/…
【解决方案2】:

要使用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)

【讨论】:

  • 谢谢,这行得通,但我希望在我已经使用的单个 to_sql 命令中有更简单的方法。
  • 非常有用可能值得将 NVARCHAR 类型编辑为 VARCHAR 或在 postgres SQL 中工作的东西?
猜你喜欢
  • 2015-06-03
  • 1970-01-01
  • 2017-10-12
  • 1970-01-01
  • 2019-12-21
  • 2021-01-24
  • 2016-05-27
  • 2018-04-09
  • 2017-05-24
相关资源
最近更新 更多