Насколько я понимаю, подготовленные заявления (в основном) - это функция базы данных, которая позволяет отделять параметры от кода, который использует такие параметры. Пример:
PREPARE fooplan (int, text, bool, numeric) AS
INSERT INTO foo VALUES($1, $2, $3, $4);
EXECUTE fooplan(1, 'Hunter Valley', 't', 200.00);
Параметрированный запрос заменяет интерполяцию ручной строки, поэтому вместо выполнения
cursor.execute("SELECT FROM tablename WHERE fieldname = %s" % value)
мы можем сделать
cursor.execute("SELECT FROM tablename WHERE fieldname = %s", [value])
Теперь кажется, что подготовленные заявления, по большей части, используются на языке базы данных, а параметризованные запросы в основном используются на языке программирования, подключающемся к базе данных, хотя я видел исключения из этого правила.
Проблема заключается в том, что вопрос о различии между подготовленным оператором и параметризованным запросом вызывает много путаницы. Их цель, по общему признанию, та же, но их методология кажется отличной. Тем не менее, есть источники , указывающие на то, что оба они одинаковы. MySQLdb и Psycopg2, похоже, поддерживают параметризованные запросы, но не поддерживают подготовленные инструкции (например, здесь для MySQLdb и TODO для драйверов postgres или этот ответ в группе sqlalchemy). На самом деле существует gist, реализующий курсор psycopg2, поддерживающий подготовленные инструкции и минимальное пояснение об этом. Существует также предложение подкласса объекта курсора в psycopg2 для предоставления подготовленного оператора вручную.
Я хотел бы получить авторитетный ответ на следующие вопросы:
-
Есть ли значимая разница между подготовленным оператором и параметризованным запросом? Это на практике? Если вы используете параметризованные запросы, вам нужно беспокоиться о подготовленных операторах?
-
Если есть разница, каков текущий статус подготовленных операторов в экосистеме Python? Какие адаптеры баз данных поддерживают подготовленные инструкции?