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.