Как вручную экранировать литералы SQL в Python

Я пытаюсь написать построитель запросов очень высокого уровня, специфичный для моего приложения. В настоящее время я использую psycopg2, у которого, похоже, нет способа избежать одного литерала, если он не является частью более крупного, уже написанного запроса.

Есть ли общий модуль для этого? У меня, кажется, не так много (если есть) вариантов.

См. также:  Закрытие нового окна консоли, запущенного из пакетного сценария, предлагает завершить сценарий
Понравилась статья? Поделиться с друзьями:
IT Шеф
Комментарии: 1
  1. Alex S

    Вы не должны нужно экранировать литералы; вот для чего нужны параметризованные операторы. psycopg2 поддерживает их как для планируемых операторов (вставка/обновление/удаление/выбор), так и для непланируемых операторов (создание таблицы, создание индекса,…).

    Вы должны всегда использовать параметризованные операторы вместо прямой замены литералов в строках запроса.

    Похоже, что psycopg2 также предоставляет некоторые функции цитирования, особенно psycopg2.extensions.adapt.

    Тем не менее, для современного PostgreSQL это довольно тривиально; вы можете следовать тем же правилам, что и для идентификаторов, только с ' вместо ":

    • Если в строке есть нулевой байт (\x00), усеките строку до нулевого байта;
    • Для каждого ' в строке замените его на ''; и
    • Добавить и добавить '.

    Вот и все. Обратная косая черта не имеет особого значения, поэтому больше нечего экранировать.

    Вам просто нужно убедиться, что standard_conforming_strings включен (SELECT current_setting('standard_conforming_strings') и выдать исключение, если это не так, потому что эти правила совершенно неверны для строк в старом стиле и строк E''.

    Было бы очень хорошо иметь функции escape_literal и escape_identifier в psycopg2. Рассмотрите возможность отправки исправления.

    Смотрите также:

Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: