Я пытаюсь написать построитель запросов очень высокого уровня, специфичный для моего приложения. В настоящее время я использую psycopg2, у которого, похоже, нет способа избежать одного литерала, если он не является частью более крупного, уже написанного запроса.
Есть ли общий модуль для этого? У меня, кажется, не так много (если есть) вариантов.
Вы не должны нужно экранировать литералы; вот для чего нужны параметризованные операторы.
psycopg2
поддерживает их как для планируемых операторов (вставка/обновление/удаление/выбор), так и для непланируемых операторов (создание таблицы, создание индекса,…).Вы должны всегда использовать параметризованные операторы вместо прямой замены литералов в строках запроса.
Похоже, что psycopg2 также предоставляет некоторые функции цитирования, особенно
psycopg2.extensions.adapt
.Тем не менее, для современного PostgreSQL это довольно тривиально; вы можете следовать тем же правилам, что и для идентификаторов, только с
'
вместо"
:\x00
), усеките строку до нулевого байта;'
в строке замените его на''
; и'
.Вот и все. Обратная косая черта не имеет особого значения, поэтому больше нечего экранировать.
Вам просто нужно убедиться, что
standard_conforming_strings
включен (SELECT current_setting('standard_conforming_strings')
и выдать исключение, если это не так, потому что эти правила совершенно неверны для строк в старом стиле и строкE''
.Было бы очень хорошо иметь функции
escape_literal
иescape_identifier
вpsycopg2
. Рассмотрите возможность отправки исправления.Смотрите также: