簡體   English   中英

Python dict進入MySQL executemany

[英]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)

怎么了? 我已經定義了operationseq_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM