【问题标题】:pyodbc AccessDB TypeError: ('Params must be in a list, tuple, or Row', 'HY000')pyodbc AccessDB TypeError: ('Params must be in a list, tuple, or Row', 'HY000')
【发布时间】:2019-03-06 13:43:53
【问题描述】:

在 Windows 7 上运行 Python 3.7.2 32 位并使用 pyodbc 包 4.0.25-cp27 32 位

我尝试了多种传递参数的方法并不断收到上述错误:

TypeError: ('Params must be in a list, tuple, or Row', 'HY000')

我的输入文件是一个包含以下内容的 txt 文件:

TEST ,EU ,Totals , 30, 0.61, 0.00000000,GOLD ,01/03/2019,   
TEST ,EU ,SubTotals , 40, 0.63, 0.00000000,GOLD ,01/03/2019,

几个版本:

qry = """INSERT INTO newtable ([Col1], [Col2], [Col3], [Col4], [Col5], [Col6], [Col7], [Col8]) VALUES (?,?,?,?,?,?,?,?);"""  

with open (inputfile, "r") as afile:  
    for line in afile:  
        params = tuple(line.split(','))  
        cursor.executemany(qry, params)  
conn.commit()  

参数值也试过了:

params = list(line.split(','))

还尝试将所有值一一插入到列表中:

params = list(line.split(","))  
a = params[0]  
b = params[1]  
c = params[2]  
d = params[3]   
e = params[4]  
f = params[5]  
g = params[6]  
h = params[7]  
dbparams = [a,b,c,d,e,f,g,h]   
cursor.executemany(qry,dbparams) 

【问题讨论】:

  • inputfile 里面有什么?
  • 如果在遍历文件中的行时,每次迭代只添加一行,然后尝试.execute 而不是.executemany
  • 我已经更新了上面的帖子,因为在没有 2 行变成 1 的情况下似乎无法在此处添加它
  • 我在第一个示例中添加了 def insert_data(),现在我得到一个不同的错误 - SQL 包含 8 个参数标记,但提供了 9 个参数。当我打印 (qry,params) 时,它确实有一个额外的参数 ''\n' 我猜这是造成这种情况的原因。因此,使用 insert_data() 函数再次尝试上面的第三个示例以仅指定 8 个参数,我再次得到主题标题中的第一个错误。所以我需要以某种方式忽略它\n
  • 知道了!!!当我输入我的最后一条评论时,实际上我自己回答了。所以在添加了 insert_data() 函数之后,我只是插入了前 8 个参数: cursor.execute(qry, params[0:8])

标签: ms-access pyodbc


【解决方案1】:

cursor.execute(qry, params[0:8]) 工作

executemany 导致错误 - 参数必须在列表、元组或行中

如果没有 [0:8],列表会通过列表末尾的 '\n' 导致错误 - SQL 包含 8 个参数标记,但提供了 9 个参数

获胜的答案是:

cursor.execute(qry, params[0:8]) 工作

感谢@gordthompson 的提示

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-03
    • 2023-04-10
    • 2021-10-15
    相关资源
    最近更新 更多