К содержимому

PostgreSQL-маппер для Go, который сверяет схему

Структуры — ваши.Схема — PostgreSQL.Генератор доказывает, что они совпадают.

Ни одно представление не порождается из другого. Структуры пишете вы, схемой владеют миграции. Команда orm читает и то и другое, показывает каждое расхождение и генерирует типизированные метаданные только из отображения, которое смогла доказать.

Как это читается
// The type parameters are the point: a Predicate[User] cannot
// reach a query over Post, and a NOT NULL column has no IsNull.
users, err := db.Users.Query().
    Where(Users.Email.ILike("%@example.com")).
    Where(Users.CreatedAt.Gte(cutoff)).
    With(Users.Orders.OrderBy(Orders.Placed.Desc()).Limit(5)).
    OrderBy(Users.CreatedAt.Desc()).
    Limit(50).
    All(ctx)

Что ловит компилятор

Типы берутся из каталога

Go-тип колонки — это то, что говорит PostgreSQL. У текстовой колонки есть Like, у целочисленной нет; у NOT NULL колонки нет IsNull. Ничего из этого не нужно держать в голове.

Nullability — свойство запроса

Колонка NOT NULL, прочитанная через outer join, всё равно может быть NULL, поэтому тип расширяется. Список выборки, который это игнорирует, отвергается при сборке, а не всплывает ошибкой сканирования на строке без совпадения.

Связи запрашиваются явно

Ленивой загрузки нет, поэтому цикл по срезу не может превратиться в запрос на строку. Загрузка идёт в ширину и пакетами: число запросов зависит от формы дерева, а не от количества строк в нём.

Миграции планируются и доказываются

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

Всегда один запрос

Композиция, CTE, производные таблицы и UNION ALL компилируются одним AST и одним писателем, с единым пространством плейсхолдеров. Ничего не собирается из строк и не склеивается в Go.

Типы PostgreSQL остаются собой

Диапазоны сохраняют модель границ, интервалы держат месяцы и дни раздельно, а uuid, jsonb, массивы и геометрия PostGIS остаются собой, а не сводятся к тому, что уже есть в Go.

Доказано, а не заявлено

За каждой замороженной вехой стоит мутационная кампания: код намеренно ломают, и набор тестов обязан это заметить. Матрица совместимости отказывается запускаться меньше чем на пяти мажорах PostgreSQL, которые заявляет проект.

14–18
мажоры PostgreSQL
56
пойманных мутаций
0
выживших