Я пытаюсь использовать подстановку параметров с 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, u'Ubuntu ')
(2, Федора)
(5, u'SuSE ')
Поскольку в документации указано, что «[y] вы не должны собирать ваш запрос, используя строковые операции Python, потому что это небезопасно; это делает вашу программу уязвимой для атаки SQL-инъекцией», - я надеюсь использовать подстановку параметров. 1012 *
Когда я пытаюсь:
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
)
)