Usando una instrucción WHERE ___ IN ___

Estoy intentando averiguar cómo usar correctamente una instrucción WHERE _ IN _

Definición:

c.execute('''CREATE TABLE IF NOT EXISTS tab ( _id integer PRIMARY KEY AUTOINCREMENT, obj text NOT NULL ) ;''') 

Estoy tratando de hacer algo como esto:

 list_of_vars=['foo','bar'] statement="SELECT * FROM tab WHERE obj IN (?)" c.execute(statement,"'"+"','".join(list_of_vars)+"'") 

Alternativamente, también he intentado esto, que evalúa directamente a lo anterior

 statement="SELECT * FROM tab WHERE obj IN (?)" c.execute(statement,"'foo','bar'") 

El error que estoy recibiendo es:

 sqlite3.ProgrammingError: Incorrect number of bindings supplied. The current statement uses 1, and there are 9 supplied 

Esto me está dando un error. Cuando lo hago de esta manera, funciona, pero esto no se recomienda ya que es vulnerable a un ataque de inyección SQL.

 statement="SELECT * FROM tab WHERE obj IN ("+"'"+"','".join(statement)+"'"+") 

Necesitas crear suficientes parámetros para que coincidan con tu lista de vars:

 statement = "SELECT * FROM tab WHERE obj IN ({0})".format(', '.join(['?'] * len(list_of_vars))) c.execute(statement, list_of_vars) 

Tenga en cuenta que pasa en list_of_vars como la lista de valores de parámetros. Usando el ', '.join() generamos una cadena de ? caracteres separados por comas, luego use .format() para insertarlo en la statement.

Para una larga lista de variables, puede ser más eficiente usar una tabla temporal para mantener esos valores, luego usar una JOIN unión ( JOIN contra la tabla temporal en lugar de una cláusula IN con parámetros de enlace.