Я считаю, что параметризованные операторы, подобные этому, предназначены для использования с значениями , а не именами таблиц (или ключевыми словами 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' в исходной строке