Substituição de parâmetros para uma cláusula “IN” do SQLite

Eu estou tentando usar substituição de parâmetro comSQLite dentro do Python para uma cláusula IN. Aqui está um exemplo completo de execução que demonstra:

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

Ela imprime:

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

Conforme os documentos afirmam, "[você não deve reunir sua consulta usando as operações de string do Python, pois isso não é seguro; ela torna seu programa vulnerável a um ataque de injeção de SQL", espero usar a substituição de parâmetro.

Quando eu tento:

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

Eu recebo um conjunto de resultados vazio e quando tento:

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

Eu recebo:

InterfaceError: Parâmetro de ligação de erro 0 - provavelmente não suportado.

Enquanto espero que qualquer resposta a este problema simplificado funcione, gostaria de salientar que a consulta real que quero executar está em uma subconsulta duplamente aninhada. A saber:

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