psycopg2 cursor.execute () с параметром запроса SQL вызывает синтаксическую ошибку - PullRequest
6 голосов
/ 20 февраля 2012

При указании параметра для execute () в psycopg2 в Python, например:

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')

1 Ответ

15 голосов
/ 20 февраля 2012

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

...