Перейти к содержанию

PostgreSQL: что работает иначе

Там, где SQLite или ClickHouse вычисляют что-то по-своему, hare оставляет их результат как есть — см. SQLite: что работает иначе и ClickHouse: что работает иначе. Отличия PostgreSQL — в том, что делает сам сервер: как он завершает транзакцию после ошибки, какой длины может быть имя, что добавляет каждая версия сервера. Каждая строка ниже говорит, что с этим делает hare.

Транзакции

PostgreSQL hare
Неудачная команда прерывает транзакцию Выход из блока без исключения откатывает её и даёт TransactionManagementError; вложенный atomic() вокруг команды сохраняет внешнюю транзакцию рабочей — см. Неудачная команда в транзакции.
CREATE INDEX CONCURRENTLY только вне транзакции AddIndex(concurrently=True) требует atomic = False у своей миграции — см. Индексы.
Ожидание блокировки без предела migrate(lock_timeout=...) ограничивает, сколько миграция ждёт блокировку таблицы, — см. Ожидание блокировок.

Значения и имена

PostgreSQL hare
Часовой пояс сеанса из настроек сервера Оба драйвера ведут каждый сеанс в UTC — см. Часовой пояс сеанса.
Имена, обрезанные до 63 байт Имя, которое создаёт hare, укладывается в 63 байта, более длинное сокращается с хэшем; явное имя длиннее 63 байт даёт ConfigurationError — см. table.
Место NULL в сортировке NULL сортируется как наибольшее значение, последним по возрастанию — см. Порядок NULL при сортировке.
Порядок текста по правилу сравнения базы Текст сравнивается и сортируется по правилу сравнения базы; Collate(...) просит другое — см. Функции базы данных.
Диапазоны целых и десятичных типа колонки Колонка сама отклоняет значение вне своего диапазона.

Версии сервера

hare читает версию сервера при подключении и включает то, что в ней есть; на более старом сервере возможность отклоняется — см. таблицу возможностей.

Версия Добавляет
15 merge(); UniqueConstraint(nulls_distinct=False)
16 explain(generic_plan=True)
17 merge().returning() и when_not_matched_by_source(); JsonTable; ExclusionConstraint на секционированной таблице; explain(memory=True), explain(serialize=True)
18 VIRTUAL GeneratedField (stored=False); db_default UuidV7(); without_overlaps=True; returning(old=...)

То, что более старый сервер делает сам, hare оставляет ему:

  • PostgreSQL до 18 отказывается приводить JSON null пути JSONField к другому типу (Cast(F("data__n"), IntField()) — cannot cast jsonb null to type integer); PostgreSQL 18 даёт NULL.
  • PostgreSQL до 18 не сообщает пулеру транзакций путь поиска — опция schema и схема на арендатора за таким пулером отклоняются (см. Пулеры подключений).

Схема и миграции

PostgreSQL hare
Расширения для векторов, геоданных, триграмм и некоторых типов Meta.extensions объявляет их, и автодетектор миграций пишет CreateExtension для каждого — см. Расширения.
Секционированные таблицы, типы индексов См. Индексы и таблицы.
Схемы Meta.schema, схема на арендатора и построчная защита работают как написано — см. Схема на арендатора.

Драйверы

rust_pg и asyncpg дают одинаковые результаты через API hare; готовый SQL различается тем, как два драйвера привязывают и читают значения, — см. Готовый SQL на двух драйверах.