Ich glaube, dass parametrisierte Anweisungen wie diese mit Werten verwendet werden sollen und nicht Tabellennamen (oder SQL-Schlüsselwörter usw.). Damit hast du also im Grunde kein Glück.
Machen Sie sich jedoch keine Sorgen, da dieser Mechanismus dazu gedacht ist, SQL-Injection zu verhindern, und Sie normalerweise wissen, auf welche Tabelle Sie zum Zeitpunkt des Codeschreibens zugreifen möchten, sodass die Wahrscheinlichkeit gering ist, dass jemand schädlichen Code einschleust. Fahren Sie einfach fort und schreiben Sie die Tabelle in den String.
Wenn Sie aus irgendeinem (möglicherweise perversen) Grund den Tabellennamen so parametrisch halten:
- Wenn der Tabellenname von Ihrem Programm stammt (z. B. ein Wörterbuch oder ein Klassenattribut), dann führen Sie die übliche String-Ersetzung durch.
- Wenn der Tabellenname aus der Außenwelt stammt (denken Sie an "Benutzereingabe"):entweder tun Sie das nicht, oder vertrauen Sie dem Benutzer vollständig und wenden Sie den vorherigen Ansatz 1 an.
Zum Beispiel:
cursor.execute(
'SELECT * FROM %s where %s = %s'
% ("my_table", "colum_name", "%s"), #1
("'some;perverse'string;--drop table foobar")) #2
#1
:Lassen Sie das dritte %s zu diesem Zeitpunkt durch ein weiteres '%s' ersetzen, um eine spätere Verarbeitung durch psycopg2#2
zu ermöglichen :Dies ist die Zeichenfolge, die von psycopg2 korrekt in Anführungszeichen gesetzt und anstelle des dritten '%s' in die ursprüngliche Zeichenfolge eingefügt wird