Не удается получить кортеж Python в качестве входных данных в предложении WHERE IN SQL? - PullRequest
0 голосов
/ 15 октября 2018

Python Code:

запрос является запросом ОБНОВЛЕНИЯ, и ошибка просто говорит о наличии некоторой проблемы с кортежем, который передается в качестве аргумента в предложение IN

pyList - это список Python, DBOBJ - это объект соединения

pyTuple = tuple(pyList)
print(pyTuple)

pyTupleSQLFormat = DBOBJ.string_literal(pyTuple)
print(pyTupleSQLFormat)

query = "UPDATE seats SET isReserved = 1 WHERE screen_name='{}' AND seat_number IN %s".format(screenname)
args = (pyTupleSQLFormat,)
CurOBJ.execute(query,args)

Вывод на консоль: Python

('B1', 'B2', 'A6', 'A7')
b"'(\\'B1\\', \\'B2\\', \\'A6\\', \\'A7\\')'"
(1064, "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''\\'(\\\\\\'B1\\\\\\', \\\\\\'B2\\\\\\', \\\\\\'A6\\\\\\', \\\\\\'A7\\\\\\')\\''' at line 1")

1 Ответ

0 голосов
/ 15 октября 2018

string_literal(...), по-видимому, готовит объект для вставки в текстовое / символьное поле, а не для его упорядочивания таким образом, чтобы его можно было добавить к запросу.

Вы можете передать содержимое кортежа в качестве дополнительногопараметры для вашего запроса путем динамического построения заполнителей параметров .Это дает дополнительное преимущество использования параметризации, чтобы избежать внедрения SQL и связанных с этим проблем.

screen_name = "example"
seat_numbers = [1, 2, 3, 4]

args = tuple([screen_name] + seat_numbers)

query = """
UPDATE 
    seats 
SET 
    isReserved = 1 
WHERE 
    screen_name=%s AND 
    seat_number IN ({placeholders})
""".format(
    placeholders=",".join(["%s"] * len(seat_numbers)),
)
print(query)
print(args)

cursor.execute(query, args)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...