Python диктует MySQL - PullRequest
       9

Python диктует MySQL

0 голосов
/ 03 декабря 2018

Мое утверждение должно соответствовать синтаксису, но я получаю ошибку "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.

1 Ответ

0 голосов
/ 03 декабря 2018

@ 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...