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
- выживших