Подтвердить что ты не робот

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

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

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

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

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

4b9b3361

Ответ 1

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

SQLstring = curs.mogrify('select name, age from people where name = %s;', ('ann',) )

Ответ 2

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


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

Подробнее см. в методе "PQexecParams" в документации libpq - libpq является библиотекой клиентского интерфейса Postgres C-уровня.