我想做一个程序,从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值开始,但这没有帮助。
我试过“重新启动变量”的情况下,数据类型的笔记本电脑已被缓存。它没有工作。
1条答案
按热度按时间zazmityj1#
您面临的问题可能源于对
dtype
在代码的不同阶段如何工作的误解。下面是一个更明确的解释:当使用
pd.read_excel
从Excel中阅读时,您可以指定dtype
来控制pandas
读取该Excel列的方式。这样做有助于pandas
从一开始就正确地解释数据:字符串
作为另一种选择,在写入SQL之前,您可以将列转换为
string
。这与您在SQL Server中将数据存储为nvarchar
的意图一致:型
您在
to_sql
中指定的dtype
指导SQLAlchemy
如何创建SQL Server列:型
您在
to_sql()
中单独设置dtype
并不能解决这个问题,因为SQLAlchemy
依赖于pandas
的dtype来处理您没有显式设置的列。对于更通用的方法,如果您以块的形式阅读Excel文件,请尝试使用更大的块大小,以帮助pandas更好地推断每列的正确dtype。