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