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 на двух драйверах.