Estoy intentando usar la sustitución de parámetros con SQLite within Python para una cláusula IN. Aquí está un ejemplo de funcionamiento completo que demuestra:Sustitución de parámetros para una cláusula SQLite "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
Se imprime:
(1, u'Ubuntu') (2, u'Fedora') (5, u'SuSE')
Como los documentos afirman que "[N] o no se debe montar su consulta mediante operaciones de cadenas de Python, ya que hacerlo es inseguro, hace que su programa sea vulnerable a un ataque de inyección SQL, "Estoy esperando utilizar la sustitución de parámetros.
cuando intento:
result_set = c.execute('SELECT * FROM distro WHERE id IN (?)', [ (", ".join(desired_ids)) ])
Obtengo un conjunto de resultados vacío, y cuando intento:
result_set = c.execute('SELECT * FROM distro WHERE id IN (?)', [ desired_ids ])
me sale:
InterfaceError: Error binding parameter 0 - probably unsupported type.
Aunque espero que cualquier respuesta para este problema simplificado funcionará, me gustaría señalar que la consulta real que deseo realizar se encuentra en una subconsulta doblemente anidada. 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
)
)
Gracias por todas las respuestas. Tuve mucho sentido cuando finalmente vi que solo necesitaba un signo de interrogación para cada parámetro que estoy sustituyendo. –