python dict到mysql executemany

isr3a4wc  于 2021-06-18  发布在  Mysql
关注(0)|答案(1)|浏览(545)

我的语句应该与语法匹配,但出现了错误 "Not all parameters were used in the SQL statement") mysql.connector.errors.ProgrammingError: Not all parameters were used in the SQL statement ```
stmt = "UPDATE abbcards SET carPlate = '%(values)s' WHERE carId =%(id)s"
params = [tuple(cusSurname.values()), tuple(cusSurname.keys())]
cur.executemany(stmt, params)

怎么了?我已经定义了 `operation` 以及 `seq_params` 变量。
tvokkenx

tvokkenx1#

@他们的评论有些道理。您正在查询字符串中使用命名占位符( %(values)s 以及 %(id)s ),因此必须以dict的形式传递参数。
但是,你也会打电话 executemany 它需要一个参数列表或元组。很多次, executemany 除了打电话什么也不做 execute 多次迭代 params ,在每次迭代中传递一个参数元素。也就是说,每个元素 params 必须包含查询的完整参数集。
查看查询字符串时,需要替换两个参数。

stmt = "UPDATE abbcards SET carPlate = '%(values)s' WHERE carId =%(id)s"

# Side note: the quote chars around %(values)s are quite certainly wrong here

从您的代码示例中,可以假设 cusSurname 是一个dict。假设它看起来像这样:

cusSurname = {'1': 'a1b1c1',
              '2': 'a2b2c2',
              '3': 'a3b3c3'}

在上面的代码中,您所做的是将cussurname的所有键和值传递给 executemany .

params = [('a1b1c1', 'a2b2c2', 'a3b3c3'), ('1', '2', '3')]

这将导致最终的查询字符串:

UPDATE abbcards SET carPlate = '\'a1b1c1\'' WHERE carId ='a2b2c2'

... 第一个参数元组中的一个元素没有被替换,这导致 mysql.connector.errors.ProgrammingError: Not all parameters were used in the SQL statement ,在第二条语句可以由字符串和参数组成之前,如下所示:

UPDATE abbcards SET carPlate = '\'1\'' WHERE carId ='2'

... 提出同样的例外。你要做的是,最终得到一个由你的单子组成的dict列表/元组 cusSurname :

stmt = "UPDATE abbcards SET carPlate = %(values)s WHERE carId =%(id)s"
params = [dict({'id': k, 'values': v}) for k,v in cusSurname.items()]

# [{'id': '1', 'values': 'a1b1c1'}, {'id': '2', 'values': 'a2b2c2'}, {'id': '3', 'values': 'a3b3c3'}]

cur.executemany(stmt, params)

或切换到位置参数:

stmt = "UPDATE abbcards SET carPlate = %s WHERE carId =%s"
params = [tuple(i) for i in cusSurname.items()]

# [('1', 'a1b1c1'), ('2', 'a2b2c2'), ('3', 'a3b3c3')]

cur.executemany(stmt, params)

相关问题