[英]Python dict into MySQL executemany
我的語句應與語法匹配,但出現錯誤"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
變量。
@ThePjot在他們的評論中有些正確。 您在查詢字符串( %(values)s
和%(id)s
)中使用命名占位符,因此必須以字典形式傳遞參數。
但是 ,您還調用了executemany
,它需要一個參數列表或元組。 很多時候, executemany
除了在遍歷params
同時多次調用execute
executemany
,什么都不做,在每次迭代中都傳遞參數元素。 這意味着, 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
是一則字典。 假設它看起來像這樣:
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'
...並提出相同的例外。 您想要做的是最終顯示由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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.