CSV数据通过Python上传到SQL表时出错
所以在过去的几天里,我一直在努力解决这个问题。我需要将一个包含大约25列和5万行的CSV文件上载到一个SQL Server表(CSV数据通过Python上传到SQL表时出错,python,sql-server,python-3.x,pymssql,Python,Sql Server,Python 3.x,Pymssql,所以在过去的几天里,我一直在努力解决这个问题。我需要将一个包含大约25列和5万行的CSV文件上载到一个SQL Server表(zzzOracle_Extract)中,该表也包含25列、相同列名和相同顺序 这是CSV文件中的行的外观: ['M&M OPTICAL SHOP', '3001211', 'SHORE', '*', 'PO BOX 7891', '', '', '', 'GUAYNABO', 'GUAYNABO', 'PR', '0090', 'United States', '
zzzOracle_Extract
)中,该表也包含25列、相同列名和相同顺序
这是CSV文件中的行的外观:
['M&M OPTICAL SHOP', '3001211', 'SHORE', '*', 'PO BOX 7891', '', '', '', 'GUAYNABO', 'GUAYNABO', 'PR', '0090', 'United States', '24-NSH RETAIL CUSTOMER', 'SH02-SHORE COLUMN 2', '3001211', '*', '*', '*', '3001211744-BILL_TO', '', '', '', '', 'RACHAEL']
因此,总共有25列,其中一些值为空。也许这是造成错误的原因。这是我的密码:
import csv
import pymssql
conn = pymssql.connect(
server="xxxxxxxxxx",
port = 2433,
user='SQLAdmin',
password='xxxxx',
database='NasrWeb'
)
with open('cleanNVG.csv','r') as f:
reader = csv.reader(f)
columns = next(reader)
query = 'insert into dbo.zzzOracle_Extract({0}) Values({1})'
query = query.format(','.join(columns),','.join('?' * len(columns)))
cursor = conn.cursor()
for data in reader:
print(data) #What a row looks like
cursor.execute(query,data)
cursor.commit()
cursor.close()
print("Done")
conn.close()
执行脚本后,我得到的错误之一如下:
ValueError: 'params' arg (<class 'list'>) can be only a tuple or a dictionary.
ValueError:'params'arg()只能是元组或字典。
我的代码有什么问题?我真的很感谢你的帮助
如何将[]连接到代码中的每一列
所以你有点像
>>列=['ID'、'Last Name'、'First Name']
你现在正在使用
>,'.join(列)
'ID,姓,名'
但是现在需要将列名用方括号括起来。这可以通过以下方式实现:
>>,'.join('['+x+']'表示列中的x)
“[ID],[姓],[名]”
Trycursor.execute(查询,元组(数据))
我厌倦了它,但它仍然抛出了一个错误和一个新的错误,(102,b“Name.DB Lib错误消息20018,严重性15:\n一般SQL Server错误:检查来自SQL Server的消息\n”),您的字段名中是否有空格?如果是这样的话,它们需要在SQL中用方括号括起来。@StevenRumbalski是的,我刚刚检查了完全相同的内容。我查看了我的SQL表设计,其中23列的数据类型为(nvarchar),另外2列的数据类型为numeric和float。这不可能吗?只是一个随机猜测。哦,好吧,我刚刚运行了print(Query)来提供我的查询的格式,它已经插入到dbo.zzzOracle_Extract中(客户名称、客户#、账户名称、识别地址标志、地址1、地址2、地址3、地址4、城市、县、州、邮政编码、国家、类别、类别、参考、参与方状态、地址状态、站点状态、收货方或收货方、默认仓库、默认订单类型、默认装运方式、Optifacts客户编号、销售人员)因此它缺少“[]“我相信感谢@Gord Thompson我为另一个join.query.format(','.join('['+x+']'表示列中的x),','.join(“%”+“s”表示列中的m))执行了此操作,因此现在我将查询放在括号中,并将查询值设置为25”%s“.然而,这是正确的,第二次连接中的#16必须是%f或浮点,我如何才能将其作为第二次连接的例外?@Cesar re:%f
-我认为这没有必要。事实上,我认为它甚至不起作用。报告说“…由于格式和类型转换是在内部处理的,因此只支持%s
和%d
占位符。这两个占位符在功能上是等效的。”请尝试对所有占位符使用%s
。