must len installed python postgresql psycopg2

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;--"})