web-dev-qa-db-fra.com

Requêtes paramétrées avec psycopg2 / Python DB-API et PostgreSQL

Quelle est la meilleure façon de faire passer psycopg2 des requêtes paramétrées à PostgreSQL? Je ne veux pas écrire mes propres mécanismes ou adaptateurs d'escpaing et le code source et les exemples de psycopg2 sont difficiles à lire dans un navigateur Web.

Si je dois passer à quelque chose comme PyGreSQL ou à un autre adaptateur python pg, cela me convient. Je veux juste un paramétrage simple.

43
jeffcook2150

psycopg2 suit les règles de DB-API 2.0 (définies dans PEP-249 ). Cela signifie que vous pouvez appeler la méthode execute à partir de votre objet cursor et utiliser le style de liaison pyformat, et il fera l'échappement pour vous. Par exemple, les éléments suivants devraient être sûrs (et fonctionner):

cursor.execute("SELECT * FROM student WHERE last_name = %(lname)s", 
               {"lname": "Robert'); DROP TABLE students;--"})
82
Hank Gay

De la documentation psycopg

( http://initd.org/psycopg/docs/usage.html )

Avertissement Jamais, jamais, JAMAIS utiliser Python concaténation de chaîne (+) ou interpolation de paramètres de chaîne (%) pour passer des variables à une chaîne de requête SQL. Même pas au bout du fusil.

La bonne façon de passer des variables dans une commande SQL utilise le deuxième argument de la méthode execute ():

SQL = "INSERT INTO authors (name) VALUES (%s);" # Note: no quotes

data = ("O'Reilly", )

cur.execute(SQL, data) # Note: no % operator

22
Fábio Dias

Voici quelques exemples qui pourraient vous être utiles

cursor.execute('SELECT * from table where id = %(some_id)d', {'some_id': 1234})

Ou vous pouvez créer dynamiquement votre requête en fonction d'un dict de nom de champ, valeur:

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)

Remarque: les champs doivent être définis dans votre code, pas entrée utilisateur, sinon vous serez sensible à l'injection SQL.

8
adam