Podstawianie parametrów dla klauzuli „IN” SQLite

Próbuję użyć podstawienia parametru za pomocąSQLite w Pythonie dla klauzuli IN. Oto kompletny przykład, który pokazuje:

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

Drukuje:

(1, u'Ubuntu ') (2, u'Fedora') (5, u'SuSE ”)

Ponieważ dokumentacja stwierdza, że ​​„[y] nie powinieneś składać zapytania za pomocą operacji łańcuchowych Pythona, ponieważ jest to niebezpieczne, czyni twój program podatnym na atak SQL injection”, mam nadzieję, że użyję podstawienia parametrów.

Kiedy próbuję:

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

Otrzymuję pusty zestaw wyników, a kiedy próbuję:

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

Dostaję:

Błąd interfejsu: Błąd wiązania parametru 0 - prawdopodobnie nieobsługiwany typ.

Chociaż mam nadzieję, że każda odpowiedź na ten uproszczony problem zadziała, chciałbym podkreślić, że rzeczywiste zapytanie, które chcę wykonać, jest w podwójnie zagnieżdżonym podzapytaniu. Dowcip:

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
        ) 
    )

questionAnswers(5)

yourAnswerToTheQuestion