psycopg — получить отформатированный sql вместо выполнения

У меня есть фрагмент кода Python, который взаимодействует с базой данных PostgreSQL через psycopg.

Вся литература предостерегает от самостоятельного форматирования sql и рекомендует доверить это драйверу. Например.:

cur.execute('select name, age from people where name = %s;', ('ann',) )

Затем драйвер форматирует строку sql. Допустим, я не хочу ничего выполнять, а просто хочу полностью отформатированную строку sql. Есть ли какие-либо функции для получения этого отформатированного sql в модуле psycopg?


person Erik Ninn-Hansen    schedule 21.07.2011    source источник


Ответы (2)


вы бы использовали функцию curs.mogrify():

SQLstring = curs.mogrify('select name, age from people where name = %s;', ('ann',) )
person Jan Marek    schedule 21.07.2011
comment
Отметим, что автор psycopg заявил, что mogrify следует использовать только в целях отладки. - person Eli Collins; 21.07.2011
comment
Для этой функции mogrify требуется DB API 2.0, initd.org/psycopg/docs/cursor. html#cursor.mogrify. - person Erik Ninn-Hansen; 21.07.2011
comment
Предположительно, вывод этого подходит для добавления «EXPLAIN» и выполнения, чтобы увидеть план выполнения? - person Jonathan Hartley; 11.11.2013
comment
@ErikNinn-Hansen pyscopg2 реализует DB API 2.0. mogrify является расширением psycopg2. DB API 2.0 не является зависимостью. - person jwg; 27.05.2015

редактировать: похоже, что следующее не совсем правильно, psycopg не использует PQexecParams, но планирует (см. мой комментарий ниже). Оставив ответ, потому что это полезная абстракция, и она верна для большинства параметризованных запросов, но, видимо, пока не psycopg2.


На самом деле драйвер не форматирует строку. То, что вы там используете, называется параметризованным запросом: строка sql и параметры отправляются «по сети» в postgres точно так, как вы их указали, postgres анализирует строку шаблона, а затем вставляет параметры в дерево разбора. Таким образом, параметры никогда не нужно кодировать или декодировать, поэтому нет вероятности каких-либо ошибок кодирования, глюков или инъекций. OTOH, это означает, что в коде нет ничего похожего на процедуру форматирования, которую вы ищете.

Дополнительные сведения см. в описании метода "PQexecParams" в libpq. документация — libpq — это библиотека клиентского интерфейса Postgres уровня C.

person Eli Collins    schedule 21.07.2011
comment
Вау, интересно. Это должно означать, что с параметризованными запросами, если возникает синтаксическая ошибка sql, это должен быть сам код, а не какие-то нечетные символы в строковом значении? - person Erik Ninn-Hansen; 21.07.2011
comment
Именно так я всегда предполагал, что все работает, и вы можете безопасно относиться к этому так, как будто это работает. Однако я только что закончил изучение исходного кода psycopg, и похоже, что они обрабатывают форматирование шаблонов и экранирование строк на стороне клиента (см. репозиторий git ). Хотя похоже, что они работают над использованием PQexecParams, где это возможно — см. это нить. - person Eli Collins; 21.07.2011
comment
Просто чтобы пролить немного света. PQexecParams имеет некоторые ограничения, поэтому форматирование запроса на стороне клиента остается. Основная причина использования mogrify только для отладки заключается в том, что мы не можем гарантировать, что его результатом всегда будет точный запрос, отправленный на серверную часть (например, если мы переключаемся на подготовку запроса и используем PQexecParams ). - person fog; 22.07.2011