2017-10-16 7 views
1

J'utilise psycopg2 en python (2.7.10) pour me connecter à une base de données postgresql. Les documents sont assez claires sur la composition des instructions SQL dynamiques:Composer une chaîne SQL dynamique avec psycopg2

Jamais, jamais, jamais utiliser la concaténation de chaîne Python (+) ou les paramètres de chaîne interpolation (%) pour passer des variables à une chaîne de requête SQL. Pas même sous la menace d'une arme.

Dans psycopg2 version 2.7, il y a le nouveau module sql pour faire cette composition de chaîne d'une manière sûre contre l'injection SQL. Je ne comprends pas cependant comment construire correctement une déclaration comme:

import psycopg2 as ps 

C = psycopg.connect(host='my_host', port=Port, database='My_DB') 
cur = C.cursor() 
schema = 'some_schema' 
table = 'some_table' 
SQL = cur.execute("SELECT * FROM "+schema+"."+table"+";")# This is horribly wrong 
SQL = cur.execute("SELECT * FROM some_schema.some_table;") # That's what the result should be 

Répondre

1

Vous pouvez utiliser psycopg2.sql.Identifier pour interpoler un identifiant à la requête, par exemple

from psycopg2 import sql 

SQL = sql.SQL("SELECT * FROM {}").format(sql.Identifier(".".join([schema, table]))) 
print SQL.as_string(C)  
cur.execute(SQL) 
+0

Il me manquait l'idée join(). – Dschoni