Je crois que les instructions paramétrées comme celle-ci sont destinées à être utilisées avec des valeurs et non des noms de table (ou des mots clés SQL, etc.). Donc, vous n'avez pas de chance avec ça.
Cependant, ne vous inquiétez pas, car ce mécanisme est destiné à empêcher l'injection SQL, et vous savez normalement à quelle table vous voulez accéder au moment de l'écriture du code, il y a donc peu de chances que quelqu'un injecte du code malveillant. Allez-y et écrivez le tableau dans la chaîne.
Si, pour une raison (peut-être perverse), vous gardez le nom de la table paramétrique comme ça :
- Si le nom de la table provient de votre programme (par exemple, un dictionnaire ou un attribut de classe), effectuez la substitution de chaîne habituelle.
- Si le nom de la table provient du monde extérieur (pensez à "entrée utilisateur") :soit ne faites pas cela, soit faites entièrement confiance à l'utilisateur et appliquez l'approche précédente 1.
Par exemple :
cursor.execute(
'SELECT * FROM %s where %s = %s'
% ("my_table", "colum_name", "%s"), #1
("'some;perverse'string;--drop table foobar")) #2
#1
:Laissez le troisième %s être remplacé par un autre '%s' à ce moment, pour permettre un traitement ultérieur par psycopg2#2
:Il s'agit de la chaîne qui sera correctement citée par psycopg2 et placée à la place de ce troisième '%s' dans la chaîne d'origine