2012-02-19 4 views
4

При указании параметра для выполнения() в psycopg2 в Python, например:psycopg2 cursor.execute() с параметром SQL запросов вызывает синтаксическую ошибку

cursor.execute('SELECT * FROM %s', ("my_table",)) 

Я получаю эту ошибку:

psycopg2.ProgrammingError: syntax error at or near "'my_table'" 
LINE 1: SELECT * FROM 'my_table' 

Что я делаю неправильно? Похоже, что psycopg2 добавляет одинарные кавычки в запрос, и эти одинарные кавычки вызывают синтаксическую ошибку.

Если я не использую параметр, он работает правильно:

cursor.execute('SELECT * FROM my_table') 

ответ

13

Я считаю, что параметризованные заявления, как это предназначены для использования с значениями а не именами таблиц (или ключевыми словами SQL, и т.д. .). Таким образом, вы в этом не повезло.

Однако не беспокойтесь, поскольку этот механизм предназначен для предотвращения SQL-инъекций, и вы обычно знаете, в какую таблицу вы хотите получить доступ во время написания кода, поэтому мало шансов, что кто-то может ввести вредоносный код. Просто продолжайте писать таблицу в строке.

Если по какой-то (возможно, извращенной) причине вы держите имя таблицы параметрический так:

  1. Если имя таблицы приходит из вашей программы (например, словарь, или атрибут класса), то сделайте обычное подстановка строк.
  2. Если имя таблицы происходит от внешнего мира (думаю, что «ввод данных пользователем»): либо не делают этого, или полностью доверять пользователю и применить предыдущий подход 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' в исходной строке

+0

Очень красивый подробный ответ, только то, что мне нужно. Благодаря! –

Смежные вопросы