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