Параметр списка в pyodb c подготовленный оператор - PullRequest
2 голосов
/ 03 марта 2020

Я пытаюсь создать подготовленный оператор со следующим шаблоном:

SELECT * FROM table WHERE key IN (value1, value2, value3, ..., valueN)

С pyodb c Я попробовал следующий синтаксис:

values = set(...)
cursor.execute('SELECT * FROM table WHERE key IN (?)', values)

Ошибка:

The SQL contains <N> paramter markers, but 1 parameters were supplied

Нужно ли генерировать (?, ?, <...>, ?) для N? или я могу как-то вставить список / набор в одно поле подготовленного оператора.

1 Ответ

1 голос
/ 03 марта 2020

Вы пытаетесь привязать список / набор / коллекцию к заполнителю ?, который может получить только одно скалярное значение. Один из вариантов здесь - построить динамическое предложение c WHERE key IN (?,?,?) на основе длины списка:

values = [value1, value2, value3, ...]
query = '(?' + ', ?' * (len(values) - 1) + ')'
sql = 'SELECT * FROM table WHERE key IN ' + query
cursor.execute(sql)

Ключевым моментом здесь является то, что если число заполнителей ? соответствует размеру список, который вы пытаетесь связать, тогда он работает.

...