pandas to_sql即使在指定dtype之后也会出现转换错误

3npbholx  于 2023-11-15  发布在  其他
关注(0)|答案(1)|浏览(164)

我想做一个程序,从Excel导入数据到SQL表。我需要为 * 几百个 * 文件做这件事,所以我需要有一个通用的方法。
我正在使用SQLAlchemy将数据框导入SQL Server,但列ProductCode导致了一个问题。前1000行左右是整数,因此SQL Alchemy将数据类型标识为整数。然而,在SQL Server中创建表时,有一些nvarchar值会导致转换错误Conversion failed when converting the nvarchar value 'AOE1' to data type int


的数据
我尝试指定列ProductCode应该是nvarchar,但错误仍然存在。我不能为所有列编写dtype参数,因为我不知道Excel文件的结构如何,然后将其导入数据框。

import sqlalchemy as sa
import pandas as pd

sqlcon = sa.create_engine('mssql+pyodbc://@' + serverName + '/' + databaseName + '?trusted_connection=yes&driver=SQL+Server')

xl2 = pd.read_excel(fullPath, sheet_name=sheetName, header=None)
xl2.to_sql(tableName,schema='dbo',con=sqlcon, index=False, if_exists='replace', dtype={'ProductCode': sa.types.NVARCHAR})

字符串
我试着进入Excel,复制列名,以防列名中有空格或其他东西,但事实并非如此。
我仍然得到相同的错误Conversion failed when converting the nvarchar value 'AOE1' to data type int。我可以指定一个列的dtype(让其他列由SqlAlchemy标识?)或者我可以强制SqlAlchemy以更多的值作为其数据类型标识符的基础(这样我就可以捕获nvarchar值)吗?

编辑

我已经进入Excel文件,并按照ProductCode列对表进行排序,使其以nvarchar值开始,但这没有帮助。
我试过“重新启动变量”的情况下,数据类型的笔记本电脑已被缓存。它没有工作。

zazmityj

zazmityj1#

您面临的问题可能源于对dtype在代码的不同阶段如何工作的误解。下面是一个更明确的解释:
当使用pd.read_excel从Excel中阅读时,您可以指定dtype来控制pandas读取该Excel列的方式。这样做有助于pandas从一开始就正确地解释数据:

xl2 = pd.read_excel(fullPath, sheet_name=sheetName, dtype={'ProductCode': 'object'})

字符串
作为另一种选择,在写入SQL之前,您可以将列转换为string。这与您在SQL Server中将数据存储为nvarchar的意图一致:

xl2['ProductCode'] = xl2['ProductCode'].astype('object')


您在to_sql中指定的dtype指导SQLAlchemy如何创建SQL Server列:

xl2.to_sql(tableName, schema='dbo', con=sqlcon, index=False, if_exists='replace', dtype={'ProductCode': sa.types.NVARCHAR})


您在to_sql()中单独设置dtype并不能解决这个问题,因为SQLAlchemy依赖于pandas的dtype来处理您没有显式设置的列。

对于更通用的方法,如果您以块的形式阅读Excel文件,请尝试使用更大的块大小,以帮助pandas更好地推断每列的正确dtype。

相关问题