psycopg - получите отформатированный sql вместо выполнения - PullRequest
17 голосов
/ 21 июля 2011

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

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

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

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

Ответы [ 2 ]

19 голосов
/ 21 июля 2011

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

SQLstring = curs.mogrify('select name, age from people where name = %s;', ('ann',) )
1 голос
/ 21 июля 2011

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


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

Для получения дополнительной информации см. Метод «PQexecParams» в документации libpq - libpq - это библиотека клиентского интерфейса C-уровня Postgres.

...