Вярвам, че параметризирани изрази като това са предназначени да се използват с стойности а не имена на таблици (или SQL ключови думи и т.н.). Така че всъщност нямате късмет с това.
Въпреки това, не се притеснявайте, тъй като този механизъм е предназначен да предотврати инжектиране на SQL и обикновено знаете до коя таблица искате да получите достъп по време на писане на код, така че има малък шанс някой да инжектира зловреден код. Просто продължете и напишете таблицата в низа.
Ако по някаква (вероятно погрешна) причина запазите името на таблицата параметрично по този начин:
- Ако името на таблицата идва от вашата програма (напр. речник или атрибут на клас), тогава направете обичайното заместване на низ.
- Ако името на таблицата идва от външния свят (помислете за „въведено от потребителя“):или не правете това, или се доверете напълно на потребителя и приложете предишния подход 1.
Например:
cursor.execute(
'SELECT * FROM %s where %s = %s'
% ("my_table", "colum_name", "%s"), #1
("'some;perverse'string;--drop table foobar")) #2
#1
:Нека третият %s да бъде заменен с друг '%s' в този момент, за да позволи по-късна обработка от psycopg2#2
:Това е низът, който ще бъде правилно цитиран от psycopg2 и поставен вместо този трети '%s' в оригиналния низ