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