Jag tror att parametriserade uttalanden som detta är avsedda att användas med värden och inte tabellnamn (eller SQL-nyckelord, etc.). Så du har i princip tur med det här.
Men oroa dig inte, eftersom den här mekanismen är avsedd att förhindra SQL-injektion, och du vet normalt vilken tabell du vill komma åt vid kodskrivningstidpunkten, så det finns liten chans att någon kan injicera skadlig kod. Fortsätt bara och skriv tabellen i strängen.
Om du av någon (möjligen pervers) anledning behåller tabellnamnets parametrisk så här:
- Om tabellnamnet kommer från ditt program (t.ex. en ordbok eller klassattribut) gör du det vanliga strängbytet.
- Om tabellnamnet kommer från den yttre världen (tänk "användarinmatning"):gör antingen inte det, eller lita på användaren helt och hållet och tillämpa den tidigare metoden 1.
Till exempel:
cursor.execute(
'SELECT * FROM %s where %s = %s'
% ("my_table", "colum_name", "%s"), #1
("'some;perverse'string;--drop table foobar")) #2
#1
:Låt den tredje %s ersättas med en annan '%s' vid denna tidpunkt, för att möjliggöra senare bearbetning av psycopg2#2
:Det här är strängen som kommer att citeras korrekt av psycopg2 och placeras istället för den tredje "%s" i originalsträngen