len - Consultas parametrizadas con psycopg2/Python DB-API y PostgreSQL
psycopg2 must be installed (3)
¿Cuál es la mejor manera de hacer que psycopg2 pase consultas parametrizadas a PostgreSQL? No quiero escribir mis propios mecanismos o adaptadores de escpaing y el código fuente de psycopg2 y los ejemplos son difíciles de leer en un navegador web.
Si necesito cambiar a algo como PyGreSQL u otro adaptador de python pg, me parece bien. Solo quiero una parametrización simple.
Aquí hay algunos ejemplos que pueden ser útiles
cursor.execute(''SELECT * from table where id = %(some_id)d'', {''some_id'': 1234})
O puede construir dinámicamente su consulta en función de un dict de nombre de campo, valor:
fields = '', ''.join(my_dict.keys())
values = '', ''.join([''%%(%s)s'' % x for x in my_dict])
query = ''INSERT INTO some_table (%s) VALUES (%s)'' % (fields, values)
cursor.execute(query, my_dict)
Nota: los campos deben estar definidos en su código, no por el usuario, de lo contrario, será susceptible a la inyección de SQL.
De la documentación psycopg
( initd.org/psycopg/docs/usage.html )
Advertencia Nunca, nunca, NUNCA use la concatenación de cadenas de Python (+) o la interpolación de parámetros de cadena (%) para pasar variables a una cadena de consulta SQL. Ni siquiera a punta de pistola.
La forma correcta de pasar variables en un comando SQL es usar el segundo argumento del método execute ():
SQL = "INSERT INTO authors (name) VALUES (%s);" # Note: no quotes
data = ("O''Reilly", )
cur.execute(SQL, data) # Note: no % operator
psycopg2
sigue las reglas para DB-API 2.0 (establecido en PEP-249 ). Esto significa que puede llamar al método de execute
desde el objeto del cursor
y usar el estilo de enlace del pyformat
, y hará el escape por usted. Por ejemplo, lo siguiente debe ser seguro (y funciona):
cursor.execute("SELECT * FROM student WHERE last_name = %(lname)s",
{"lname": "Robert''); DROP TABLE students;--"})