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

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

si j'ai besoin de passer à quelque chose comme PyGreSQL ou un autre adaptateur Python pg, ça me va. Je veux juste un paramétrage simple.

34
demandé sur Kara 2009-09-23 19:28:13

3 réponses

psycopg2 suit les règles pour DB-API 2.0 (fixés dans la PEP-249 ). Cela signifie que vous pouvez appeler execute méthode de votre cursor objet et d'utiliser le pyformat style de liaison, et il fera l'évasion pour vous. Par exemple, le suivant devrait être sûr (et de travail):

cursor.execute("SELECT * FROM student WHERE last_name = %(lname)s", 
               {"lname": "Robert'); DROP TABLE students;--"})
66
répondu Hank Gay 2013-02-12 08:20:25

de la documentation psycopg

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

Avertissement ne Jamais, jamais, jamais utiliser Python de concaténation de chaîne (+) ou paramètres de la chaîne d'interpolation (%) de 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 est d'utiliser 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

13
répondu Fábio Dias 2015-09-23 15:11:13

voici quelques exemples qui pourraient vous être utiles""

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

ou vous pouvez construire dynamiquement votre requête basée sur 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)

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

11
répondu adam 2015-04-13 16:12:21