Python pyodbc:(';参数必须位于具有NumPy数据的列表、元组或行';、';HY000';)中

Python pyodbc:(';参数必须位于具有NumPy数据的列表、元组或行';、';HY000';)中,python,pandas,numpy,pyodbc,Python,Pandas,Numpy,Pyodbc,我试图通过pyodbc和Python3将元组列表插入MS SQL表。这项工作: conn_string = (('DRIVER=FreeTDS;' 'SERVER={};' 'PORT=1433;' 'DATABASE={};' 'UID={};' 'PWD={};' 'TDS_Version=8.0;')

我试图通过pyodbc和Python3将元组列表插入MS SQL表。这项工作:

conn_string = (('DRIVER=FreeTDS;'
                'SERVER={};'
                'PORT=1433;'
                'DATABASE={};'
                'UID={};'
                'PWD={};'
                'TDS_Version=8.0;')
               .format(server, db, user, pwd))
sql = """
insert into Table1(field1, field2, field3) values (?, ?, ?)
"""

cursor.executemany(sql, [('1175B57E-7A10-4BAC-B22E-457C8266C0F2', '1D111FA5-A65D-4F77-A3AB-78B80BAF0C0B', 2),
 ('C60FA1C9-7656-4EBF-A577-44CBF0C641F4', '365FB706-9F7F-4ED4-AB88-927AE1F762A6', 1),
 ('2DF071CE-ABDF-4119-9573-2B0CA2B99C9C', '590E266D-810C-4DC2-BA5A-BAC05A9982C4', 0),
 ('EB794EF9-5FF4-49D3-B81E-F14F69C09306', '1D6E0C95-DF96-45D5-B8F3-211D825A160F', 0),
 ('EB794EF9-5FF4-49D3-B81E-F14F69C09306', '17D2EC66-845F-495D-9020-91E144B2E595', 0),
 ('EB794EF9-5FF4-49D3-B81E-F14F69C09306', '3A694B33-39F4-4F5B-899B-9B27810E4D82', 1),
 ('2DF071CE-ABDF-4119-9573-2B0CA2B99C9C', '4EE1D6F4-4A1E-4316-93D5-2AE1F461A193', 0),
 ('410DE087-1ADF-4EEA-BCE6-D7A1124E2A51', '17D2EC66-845F-495D-9020-91E144B2E595', 0),
 ('C60FA1C9-7656-4EBF-A577-44CBF0C641F4', '250256D4-4A3A-48E0-BCBA-7CD89011D81F', 1),
 ('2DF071CE-ABDF-4119-9573-2B0CA2B99C9C', '4D363718-FE0C-4257-8E4C-5C9A024BAEFF', 0)])
但这并不是:

params = list(row for row in data_table.round(0).head(10).to_records(index=False))

cursor.executemany(sql, params)
产生此错误:

('Params must be in a list, tuple, or Row', 'HY000')
即使
params
的输出为:

[('1175B57E-7A10-4BAC-B22E-457C8266C0F2', '1D111FA5-A65D-4F77-A3AB-78B80BAF0C0B', 2),
     ('C60FA1C9-7656-4EBF-A577-44CBF0C641F4', '365FB706-9F7F-4ED4-AB88-927AE1F762A6', 1),
     ('2DF071CE-ABDF-4119-9573-2B0CA2B99C9C', '590E266D-810C-4DC2-BA5A-BAC05A9982C4', 0),
     ('EB794EF9-5FF4-49D3-B81E-F14F69C09306', '1D6E0C95-DF96-45D5-B8F3-211D825A160F', 0),
     ('EB794EF9-5FF4-49D3-B81E-F14F69C09306', '17D2EC66-845F-495D-9020-91E144B2E595', 0),
     ('EB794EF9-5FF4-49D3-B81E-F14F69C09306', '3A694B33-39F4-4F5B-899B-9B27810E4D82', 1),
     ('2DF071CE-ABDF-4119-9573-2B0CA2B99C9C', '4EE1D6F4-4A1E-4316-93D5-2AE1F461A193', 0),
     ('410DE087-1ADF-4EEA-BCE6-D7A1124E2A51', '17D2EC66-845F-495D-9020-91E144B2E595', 0),
     ('C60FA1C9-7656-4EBF-A577-44CBF0C641F4', '250256D4-4A3A-48E0-BCBA-7CD89011D81F', 1),
     ('2DF071CE-ABDF-4119-9573-2B0CA2B99C9C', '4D363718-FE0C-4257-8E4C-5C9A024BAEFF', 0)]

如对问题的评论所述,问题是:

cursor.executemany(sql,params)
失败是因为

params=list(数据表中行对行。舍入(0)。头(10)。to_记录(索引=False))
没有返回“list[s]、tuple[s]或[pyodbc]行[s]的列表,而是返回“numpy.records”的列表。解决方案是转换“记录”,以便
params
包含元组列表:

params=list(数据表中行的元组(行)头(10).值)

我认为需要指出的是,如果使用
元组(\uuuuu item\uuuuu)
,字符串将被每个字符分开。。。把你的字符串看作C++的const char指针。元组是将const chars指针项和所有元素放入一个元组中。要停止此操作,可以将字符串按如下方式放入列表:
元组([\uu字符串])
。列表不会留在元组中,它只是说将整个const char指针项作为一个元素放入元组中。希望这有帮助,最近工作中出现了此问题。

刚刚测试,我无法重现您的问题。你的RDM是什么?谢谢。这是MS SQL Server 2014。如果有帮助的话,字符串字段将被整理为“SQL\u Latin1\u General\u CP1\u CI\u AS”。params中有一个列表,列表不能作为函数参数传递。尝试将其更改为
params=(('A','B',2),('C','D',1),('E','F',0))
让我知道我想我找到了-
到_records()
实际上创建了一个numpy.records列表。我将其更改为
params=list(数据表中的行的元组(行)head(10).values)
,并且它可以工作。感谢您花时间提供答案。请仔细考虑阅读问题。你的回答不是OP想要的。不要放置来自其他编程语言的引用。寻找这个答案的人可能不懂那种语言。