Jeg tror, at parametriserede udsagn som dette er beregnet til at blive brugt med værdier og ikke tabelnavne (eller SQL-nøgleord osv.). Så du er dybest set uheldig med dette.
Du skal dog ikke bekymre dig, da denne mekanisme er beregnet til at forhindre SQL-injektion, og du normalt ved, hvilken tabel du vil have adgang til ved kodeskrivning, så der er ringe chance for, at nogen kan injicere ondsindet kode. Bare gå videre og skriv tabellen i strengen.
Hvis du af en eller anden (muligvis pervers) grund beholder tabelnavnets parametriske sådan:
- Hvis tabelnavnet kommer fra dit program (f.eks. en ordbog eller klasseattribut), så udfør den sædvanlige strengerstatning.
- Hvis tabelnavnet kommer fra den eksterne verden (tænk "brugerinput"):gør det enten ikke, eller stol helt på brugeren og anvend den tidligere fremgangsmåde 1.
For eksempel:
cursor.execute(
'SELECT * FROM %s where %s = %s'
% ("my_table", "colum_name", "%s"), #1
("'some;perverse'string;--drop table foobar")) #2
#1
:Lad den tredje %s erstattes med en anden '%s' på dette tidspunkt for at tillade senere behandling af psycopg2#2
:Dette er strengen, der bliver korrekt citeret af psycopg2 og placeret i stedet for den tredje '%s' i den originale streng