@ ThePjot несколько прав в своем комментарии.Вы используете именованные заполнители в строке запроса (%(values)s
и %(id)s
), поэтому вам нужно передать параметры в виде указания.
НО , вы также вызываете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
является диктом.Скажем, это выглядит так:
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)