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