w3schools tutorial create python sql

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))


No lo complique, 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)

¡Espero que esto haya ayudado!


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, )