Ответ 1
Вы используете функцию curs.mogrify():
SQLstring = curs.mogrify('select name, age from people where name = %s;', ('ann',) )
У меня есть часть кода Python, которая взаимодействует с базой данных PostgreSQL через psycopg.
Вся литература предупреждает о том, как делать sql-форматирование самостоятельно, и рекомендует разрешить драйверу делать это. Например:.
cur.execute('select name, age from people where name = %s;', ('ann',) )
Затем драйвер форматирует строку sql. Скажем, я не хочу ничего выполнять, но я просто хочу полностью отформатированную строку sql. Есть ли какие-либо функции для получения этого форматированного sql в модуле psycopg?
Вы используете функцию curs.mogrify():
SQLstring = curs.mogrify('select name, age from people where name = %s;', ('ann',) )
edit: похоже, что это не совсем правильно, psycopg не использует PQexecParams, но он планирует (см. мой комментарий ниже). Оставляя ответ, потому что это полезная абстракция и истинна для большинства параметризованных запросов, просто, по-видимому, не psycopg2 пока еще.
На самом деле драйвер не форматирует строку. То, что вы используете там, называется параметризованным запросом: строка sql и параметры отправляются "по проводам" в postgres точно так, как вы их указали, postgres анализирует строку шаблона, а затем вставляет параметры в дерево разбора. Таким образом, параметры никогда не должны быть закодированы или декодированы, поэтому нет никаких шансов на ошибки кодирования, сбои или атаки на инъекции. OTOH, это означает, что ни в коем случае в коде нет ничего похожего на процедуру форматирования, которую вы ищете.
Подробнее см. в методе "PQexecParams" в документации libpq - libpq является библиотекой клиентского интерфейса Postgres C-уровня.