【问题标题】:pandas.to_sql function does not convert dtype as expectedpandas.to_sql 函数未按预期转换 dtype
【发布时间】:2021-09-19 19:52:29
【问题描述】:

我正在尝试使用以下代码将 pandas df 导出到 SQL Server:

dtypedict={"column1": sqlalchemy.types.VARCHAR(length=50), 
                   "column2": sqlalchemy.types.VARCHAR(length=50),
                   'column3': sqlalchemy.types.VARCHAR(length=50),
                   'column4': sqlalchemy.types.INTEGER(),
                   'column5': sqlalchemy.types.Date(),
                   'column6': sqlalchemy.types.VARCHAR(length=50),
                   'column7': sqlalchemy.types.VARCHAR(length=50),
                   'column8': sqlalchemy.types.VARCHAR(length=50), 
                   'column9': sqlalchemy.types.VARCHAR(length=50)}

staging.columns = staging.columns.str.replace(' ','_')
staging.fillna('', inplace=True)

server = 'SV' 
database = 'DB' 
username = 'U' 
password = 'PW'  
cnxn = 'DRIVER={SQL Server};SERVER='+server+';DATABASE='+database+';UID='+username+';PWD='+ password

engine = create_engine('mssql+pyodbc:///?odbc_connect={}'.format(cnxn))

staging.to_sql('Staging_table', schema='dbo', con=engine, chunksize=50, index=False, if_exists='replace', dtype=dtypedict, method='multi')

由于某种原因,我不断收到以下错误:

('22018', "[22018] [Microsoft][ODBC SQL Server Driver][SQL Server]Conversion failed when converting the nvarchar value 'No EQ' to data type int. (245) (SQLExecDirectW)")

此“无 EQ”值出现在第 2 列中。我不明白为什么函数会尝试将 nvarchar 转换为 int,因为指定的 dtype 是 varchar。检查 Azure Data Studio 中的列类型,varchar 也被正确解析为 column2 的 sql 类型。 df dtype 是对象。

不幸的是,由于权限限制,我不得不使用旧的 SQL 服务器驱动程序,并且无法下载最近的 ODBC 驱动程序。

任何人有建议如何解决这个问题?

我仔细检查了 dict 中的列名是否正确命名,并且它们都是正确的:

col_list = staging.columns.to_list()

for col in col_list:
    for key in dtypedict.items():
        if col in key:
            print('True for ' + col)

【问题讨论】:

  • 再次检查 dtypedict 中的列名是否与 DataFrame 中的列名完全匹配。如果我们在 dtype= 中包含 DataFrame 中不存在的列名,则 .to_sql() 会默默地忽略它。
  • @GordThompson 一切似乎都匹配,我使用我编辑的帖子中的代码进行验证,一切都解决了。
  • 如果使用from_sql,你会从数据库中得到哪些列名和数据类型?它们也与此匹配吗?
  • @rfkortekaas 列在导出时使用正确的 dtypes 导入,因此与最初声明的列和 sqlalchemy 类型相对应。

标签: sql pandas sqlalchemy


【解决方案1】:

看起来 df 或 to_sql 进程中的对象 dtype 不适用于看似包含整数值和字符串值并且被误解为 int 列的列,即使 dtype 是用 dict 指定的。

我使用 .astype(str) 函数转换了所有组合的 dtype 列,现在 to_sql 适用于所有列!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-30
    • 2016-11-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多