Věřím, že parametrizované příkazy, jako je tento, jsou určeny k použití s hodnotami a ne názvy tabulek (nebo klíčová slova SQL atd.). Takže v tomhle máte v podstatě smůlu.
Nemějte však obavy, protože tento mechanismus má zabránit vkládání SQL a běžně víte, ke které tabulce chcete přistupovat v době psaní kódu, takže je malá šance, že by někdo mohl vložit škodlivý kód. Pokračujte a napište tabulku do řetězce.
Pokud z nějakého (možná zvráceného) důvodu ponecháte název tabulky parametrický takto:
- Pokud název tabulky pochází z vašeho programu (např. slovník nebo atribut třídy), proveďte obvyklou náhradu řetězce.
- Pokud název tabulky pochází z vnějšího světa (předpokládejte „vstup uživatele“):buď to nedělejte, nebo uživateli zcela důvěřujte a použijte předchozí přístup 1.
Například:
cursor.execute(
'SELECT * FROM %s where %s = %s'
% ("my_table", "colum_name", "%s"), #1
("'some;perverse'string;--drop table foobar")) #2
#1
:Nechte nyní třetí %s nahradit jiným '%s', aby bylo možné později zpracování pomocí psycopg2#2
:Toto je řetězec, který bude správně citován psycopg2 a umístěn místo třetího '%s' v původním řetězci