Pasando un nombre de columna en una instrucción SELECT en Python

if count == 1: cursor.execute("SELECT * FROM PacketManager WHERE ? = ?", filters[0], parameters[0]) all_rows = cursor.fetchall() elif count == 2: cursor.execute("SELECT * FROM PacketManager WHERE ? = ? AND ? = ?", filters[0], parameters[0], filters[1], parameters[1]) all_rows = cursor.fetchall() elif count == 3 : cursor.execute("SELECT * FROM PacketManager WHERE ? = ? AND ? = ? AND ? = ?", filters[0], parameters[0], filters[1], parameters[1], filters[2], parameters[2]) all_rows = cursor.fetchall() 

Este es un fragmento de código en mi progtwig. Lo que planeo hacer es pasar el nombre de la columna y el parámetro en la consulta.

La matriz de filtros contiene los nombres de columna, la matriz de parámetros contiene los parámetros. El conteo es el número de filtros establecidos por el usuario. Los filtros y la matriz de parámetros ya están listos y no tienen ningún problema. Solo necesito pasarlo a la consulta para que se ejecute. Esto me da un error de “TypeError: la función toma como máximo 2 argumentos”

Solo puedes configurar los parámetros usando ? , no nombres de tablas o columnas.

Podrías construir un dict con consultas predefinidas.

 queries = { "foo": "SELECT * FROM PacketManager WHERE foo = ?", "bar": "SELECT * FROM PacketManager WHERE bar = ?", "foo_bar": "SELECT * FROM PacketManager WHERE foo = ? AND bar = ?", } # count == 1 cursor.execute(queries[filters[0], parameters[0]) # count == 2 cursor.execute(queries[filters[0] + "_" + queries[filters[1], parameters[0]) 

Este enfoque le hará guardar desde la inyección de SQL en los filters[0] .

No puede usar parámetros SQL para interpolar nombres de columnas. Tendrás que usar el formato clásico de cadena para esas partes. Ese es el punto de los parámetros SQL; citan valores para que no puedan interpretarse como sentencias de SQL o nombres de objetos.

Lo siguiente, usar el formato de cadena para el nombre de la columna funciona, pero esté 100% seguro de que el valor de los filters[0] no proviene de la entrada del usuario:

 cursor.execute("SELECT * FROM PacketManager WHERE {} = ?".format(filters[0]), (parameters[0],)) 

Es probable que desee validar el nombre de la columna con un conjunto de nombres de columna permisibles, para garantizar que no se produzca ninguna inyección.