tutorial - lista de python en SQL consulta como parámetro
python sql (9)
Tengo una lista de Python, digo l
l = [1,5,8]
Quiero escribir una consulta SQL para obtener los datos de todos los elementos de la lista, por ejemplo
"seleccionar nombre de studens donde id = | EN LA LISTA l |"
¿Cómo logro esto?
El SQL que quieres es
select name from studens where id in (1, 5, 8)
Si quieres construir esto desde la pitón podrías usar
l = [1, 5, 8]
sql_query = ''select name from studens where id in ('' + '',''.join(map(str, l)) + '')''
La función de map transformará la lista en una lista de cadenas que se pueden unir 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 de generador 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))
En cuanto a mí, quiero consultar información de db por id list (el siguiente código es un ejemplo sql)
lst = [1, 2, 3]
str_lst = '',''.join([str(item) for item in lst])
sql = """select url ,uid from tb_name where id in (%s)""" % str_lst
print sql
salida
seleccione url, uid de tb_name donde id en (1,2,3)
función de miembro de la clase de práctica:
def get_url_by_id_lst(self, lst_id):
str_lst = '',''.join([str(item) for item in lst_id])
sql = """
select url ,uid from tb_face_rec_sample_xy where id in (%s)
""" % str_lst
self.cursor.execute(sql)
return [row for row in self.cursor]
La forma más fácil es convertir la lista en tuple
primero
t = tuple(l)
select name from studens where id IN" + str(t)
Las respuestas hasta ahora han sido la creación de plantillas de los valores en una cadena de SQL simple. Eso está absolutamente bien para los enteros, pero si quisiéramos hacerlo por cadenas, obtendríamos el problema del escape.
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)
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 noté esto:
placeholders= '', ''.join(placeholder for unused in l)
Puede ser reemplazado por:
placeholders= '', ''.join(placeholder*len(l))
Encuentro esto más directo si 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__
), lo que no debería ser un problema. Pero el marcador de posición también debe ser un solo carácter. Para admitir un uso de marcador de varios caracteres:
placeholders= '', ''.join([placeholder]*len(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('']'','')'') )
Solución para respuesta @umounted, porque rompió con una tupla de un elemento, ya que (1,) no es SQL válido .:
>>> 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 cadena sql:
cursor.execute("select id from test where id in (%s)" % (''"''+''", "''.join(l)+''"''))
str.join los valores de la lista separados por comas, y use el operador format para formar una cadena de consulta.
myquery = "select name from studens where id in (%s)" % ",".join(map(str,mylist))
(Gracias, )