lista de python en la consulta SQL como parámetro

Tengo una lista de python, di l

l = [1,5,8] 

Quiero escribir una consulta de SQL para obtener los datos de todos los elementos de la lista, por ejemplo

 select name from students where id = |IN THE LIST l| 

¿Cómo logro esto?

Hasta ahora, las respuestas han sido la creación de plantillas de valores en una cadena de SQL simple. Eso es absolutamente correcto para los enteros, pero si quisiéramos hacerlo por cadenas obtenemos el problema de escapar.

Aquí hay una variante que usa una consulta parametrizada que funcionaría para ambos:

 placeholder= '?' # For SQLite. See DBAPI paramstyle. placeholders= ', '.join(placeholder for unused in l) query= 'SELECT name FROM students WHERE id IN (%s)' % placeholders cursor.execute(query, l) 

El SQL que quieres es

 select name from studens where id in (1, 5, 8) 

Si quieres construir esto desde el python puedes usar

 l = [1, 5, 8] sql_query = 'select name from studens where id in (' + ','.join(map(str, l)) + ')' 

La función de mapa transformará la lista en una lista de cadenas que se pueden pegar mediante comas usando el método str.join .

Alternativamente:

 l = [1, 5, 8] sql_query = 'select name from studens where id in (' + ','.join((str(n) for n in l)) + ')' 

Si prefiere expresiones generadoras a la función de mapa.

ACTUALIZACIÓN: S. Lott menciona en los comentarios que los enlaces SQLite de Python no admiten secuencias. En ese caso, es posible que desee

 select name from studens where id = 1 or id = 5 or id = 8 

Generado por

 sql_query = 'select name from studens where ' + ' or '.join(('id = ' + str(n) for n in l)) 

No lo compliques, la solución para esto es simple.

 l = [1,5,8] l = tuple(l) params = {'l': l} cursor.execute('SELECT * FROM table where id in %(l)s',params) 

introduzca la descripción de la imagen aquí

Espero que esto haya ayudado !!!

string. une los valores de la lista separados por comas y usa el operador de formato para formar una cadena de consulta.

 myquery = "select name from studens where id in (%s)" % ",".join(map(str,mylist)) 

(Gracias, Blair-Conrad )

La forma más fácil es cambiar la lista a tuple primero

 t = tuple(l) query = "select name from studens where id IN {}".format(t) 

Me gusta la respuesta de Bobince:

 placeholder= '?' # For SQLite. See DBAPI paramstyle. placeholders= ', '.join(placeholder for unused in l) query= 'SELECT name FROM students WHERE id IN (%s)' % placeholders cursor.execute(query, l) 

Pero me di cuenta de esto:

 placeholders= ', '.join(placeholder for unused in l) 

Puede ser reemplazado por:

 placeholders= ', '.join(placeholder*len(l)) 

Encuentro esto más directo aunque menos inteligente y menos general. Aquí se requiere que tenga una longitud (es decir, se refiere a un objeto que define un método __len__ ), que no debería ser un problema. Pero el marcador de posición también debe ser un solo carácter. Para apoyar el uso de un marcador de posición de múltiples caracteres:

 placeholders= ', '.join([placeholder]*len(l)) 

Solución para @ respuestas contadas, porque se rompió con una tupla de un elemento, ya que (1,) no es válido SQL .:

 >>> random_ids = [1234,123,54,56,57,58,78,91] >>> cursor.execute("create table test (id)") >>> for item in random_ids: cursor.execute("insert into test values (%d)" % item) >>> sublist = [56,57,58] >>> cursor.execute("select id from test where id in %s" % str(tuple(sublist)).replace(',)',')')) >>> a = cursor.fetchall() >>> a [(56,), (57,), (58,)] 

Otra solución para la cadena sql:

 cursor.execute("select id from test where id in (%s)" % ('"'+'", "'.join(l)+'"')) 

Por ejemplo, si quieres la consulta sql:

 select name from studens where id in (1, 5, 8) 

Qué pasa:

 my_list = [1, 5, 8] cur.execute("select name from studens where id in %s" % repr(my_list).replace('[','(').replace(']',')') ) 

Esto utiliza la sustitución de parámetros y se ocupa del caso de la lista de valores únicos:

 l = [1,5,8] get_operator = lambda x: '=' if len(x) == 1 else 'IN' get_value = lambda x: int(x[0]) if len(x) == 1 else x query = 'SELECT * FROM table where id ' + get_operator(l) + ' %s' cursor.execute(query, (get_value(l),)) 
 placeholders= ', '.join("'{"+str(i)+"}'" for i in range(len(l))) query="select name from students where id (%s)"%placeholders query=query.format(*l) cursor.execute(query) 

Esto debería solucionar tu problema.