Что это такое
GORM — ORM-библиотека для Go. Она помогает описывать модели, связи и запросы на уровне Go-кода, не отказываясь полностью от возможностей SQL.
Проект нацелен на удобство разработчика: ассоциации, хуки, предзагрузка, транзакции, пакетные вставки, SQL Builder, upsert и режимы вроде DryRun собраны в одном инструменте.
Для Go-сообщества это заметный проект, потому что язык часто поощряет явный код, а GORM предлагает более высокоуровневую модель работы с данными.
Что внутри
GORM поддерживает связи Has One, Has Many, Belongs To, Many To Many, полиморфные связи и наследование через одну таблицу. Это закрывает большую часть обычных доменных моделей.
Хуки до и после создания, сохранения, обновления, удаления и поиска позволяют встроить бизнес-правила рядом с жизненным циклом модели.
Отдельно важны транзакции, вложенные транзакции, Save Point, RollbackTo, работа с Context, подготовленными выражениями и пакетными операциями. Это делает библиотеку полезной не только для маленьких CRUD-страниц.
Как используют
GORM обычно берут в сервисах, где много повторяющейся работы с таблицами: пользователи, заказы, настройки, платежные записи, журналы событий и связанные сущности.
Библиотека помогает быстро двигаться на этапе продукта, потому что типовые запросы и связи пишутся короче. При этом для сложных мест можно использовать SQL-выражения и подсказки оптимизатора.
Ограничение в том, что ORM может спрятать стоимость запроса. Если не следить за предзагрузкой, индексами и количеством обращений к базе, удобный код легко станет медленным.
Схема модели
Пример в нейтральном формате показывает, что обычно описывает GORM: структуру модели, связь и явное поле внешнего ключа.
Сильные стороны и ограничения
Сильная сторона GORM — богатый набор возможностей вокруг реальных приложений: связи, транзакции, пакетная обработка, расширения для нескольких баз и метрики.
Слабая сторона — риск магии. Чем сложнее доменная модель, тем важнее смотреть на сгенерированный SQL и проверять планы запросов.
GORM подойдет командам на Go, которым нужна скорость разработки и аккуратная модель данных. Для сверхкритичных участков с ручной оптимизацией иногда лучше писать SQL напрямую.
Пример
Модель и связь
Пример показывает структуру, которую обычно описывают в GORM: пользователь, его заказы и внешний ключ.
type User struct {
ID uint
Name string
Orders []Order
}
type Order struct {
ID uint
UserID uint
Total int64
}