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 表时导致错误的主要内容,如果未能解决你的问题,请参考以下文章

NoSQL中的数据模型来自多个SQL表

如何从 SQL 表中下载大数据并通过一次获取 1000 条左右的记录连续保存到 csv 中

使用 Python 将 Csv 文件写入 SQL Server 数据库中已有的表

将csv上传到sql server时,“给定的ColumnMapping与源或目标中的任何列都不匹配”

将csv上传到sql server时,“给定的ColumnMapping与源或目标中的任何列都不匹配”

通过 API 上传本地 CSV 失败