Подстановка параметров для предложения SQLite «IN»

Я пытаюсь использовать подстановку параметров сSQLite в Python для предложения IN. Вот полный пример, который демонстрирует:

import sqlite3

c = sqlite3.connect(":memory:")
c.execute('CREATE TABLE distro (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT)')

for name in 'Ubuntu Fedora Puppy DSL SuSE'.split():
  c.execute('INSERT INTO distro (name) VALUES (?)', [ name ] )

desired_ids = ["1", "2", "5", "47"]
result_set = c.execute('SELECT * FROM distro WHERE id IN (%s)' % (", ".join(desired_ids)), ())
for result in result_set:
  print result

Распечатывает:

(1, ты 'Ubuntu») (2, ты 'Fedora») (5, ты 'SuSE ')

Как документы утверждают, что "[ты] ты не долженсобрать ваш запрос, используя Pythons строковые операции, потому что это небезопасно; это делает вашу программу уязвимой для атаки SQL-инъекцией " Я надеюсь использовать подстановку параметров.

Когда я пытаюсь:

result_set = c.execute('SELECT * FROM distro WHERE id IN (?)', [ (", ".join(desired_ids)) ])

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

result_set = c.execute('SELECT * FROM distro WHERE id IN (?)', [ desired_ids ] )

Я получил:

InterfaceError: Ошибка привязки параметра 0 - возможно, неподдерживаемый тип.

Хотя я надеюсь, что любой ответ на эту упрощенную проблему сработает, я хотел бы отметить, что фактический запрос, который я хочу выполнить, находится во вложенном подзапросе с двойным вложением. Для остроумия:

UPDATE dir_x_user SET user_revision = user_attempted_revision 
WHERE user_id IN 
    (SELECT user_id FROM 
        (SELECT user_id, MAX(revision) FROM users WHERE obfuscated_name IN 
            ("Argl883", "Manf496", "Mook657") GROUP BY user_id
        ) 
    )

Ответы на вопрос(5)

Ваш ответ на вопрос