CSV 数据通过 Python 上传到 SQL 表时导致错误
Posted
技术标签:
【中文标题】CSV 数据通过 Python 上传到 SQL 表时导致错误【英文标题】:CSV data causes error when uploading to SQL table via Python 【发布时间】:2016-10-07 14:18:32 【问题描述】:所以过去几天我一直在努力解决这个问题。我需要将一个包含大约 25 列和 50K 行的 CSV 文件上传到一个 SQL Server 表 (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.
我的代码有什么问题?非常感谢您的帮助!
【问题讨论】:
试试cursor.execute(query, tuple(data))
我累了,但它仍然抛出一个错误和新错误,(102, b"'Name'.DB-Lib 错误消息 20018 附近的语法不正确,严重性 15:\n一般 SQL Server 错误:检查来自 SQL Server 的消息\n")
您的字段名称中有空格吗?如果有,则需要将它们括在 SQL 中的方括号中。
@StevenRumbalski 是的,我刚刚检查的完全一样。我查看了我的 SQL 表设计,其中 23 列有 (nvarchar) 作为数据类型,另外 2 列有数字和浮点数。这不可能吧?只是随机猜测。
哦,好吧,我刚刚运行 print(Query) 来给我查询的格式,它 插入到 dbo.zzzOracle_Extract(客户名称,客户 #,帐户名称,识别地址标志,Address1,Address2,Address3,Address4,City,County,State,Postal Code,Country,Category,Class,Reference,Party status,地址状态,Site Status,Ship To or Bill To,默认仓库,默认订单类型,默认发货Method,Optifacts Customer Number,Salesperson) 所以我相信它缺少“ [ ] ”
【参考方案1】:
如何将 [ ] 加入我的代码中的每一列?
所以你有类似的东西
>>> columns = ['ID','Last Name','First Name']
你目前正在使用
>>> ','.join(columns)
'ID,Last Name,First Name'
但现在您需要将列名括在方括号中。可以这样做
>>> ','.join('[' + x + ']' for x in columns)
'[ID],[Last Name],[First Name]'
【讨论】:
感谢@Gord Thompson 我为另一个加入做到了这一点。 query.format(','.join('[' + x + ']' for x in columns),','.join("%" + "s" for m in columns)) 所以现在我有括号中的查询和值 25 "%s"。这是正确的,但是,第二个连接中的#16 必须是 %f 或浮点数,我怎样才能使它成为第二个连接的例外? @Cesar 回复:%f
- 我认为没有必要。事实上,我认为它甚至不会起作用。 pymssql documentation 表示“......由于格式和类型转换是在内部处理的,因此仅支持 %s
和 %d
占位符。两个占位符在功能上是等效的。”尝试对所有这些都使用%s
。以上是关于CSV 数据通过 Python 上传到 SQL 表时导致错误的主要内容,如果未能解决你的问题,请参考以下文章
如何从 SQL 表中下载大数据并通过一次获取 1000 条左右的记录连续保存到 csv 中
使用 Python 将 Csv 文件写入 SQL Server 数据库中已有的表
将csv上传到sql server时,“给定的ColumnMapping与源或目标中的任何列都不匹配”