Удобная ORM для Go с генерацией миграций и Query Builder’ом: Gormite
- среда, 12 февраля 2025 г. в 00:00:10
В процессе разработки на Go нередко встаёт вопрос о создании удобного уровня абстракции для работы с базой данных: хочется иметь и простую генерацию миграций, и гибкий Query Builder. Проект Gormite был создан как раз для решения этих задач. Он предлагает облегчённый подход к ORM, при этом сохраняя гибкость при формировании SQL-запросов.
Gormite – это CLI-инструмент, которая не нуждается в прямой интеграции в go.mod. Она читает конфигурацию (mapping) из YAML-файла и по указанным в нём entities генерирует миграции для базы данных. Дополнительно в Gormite входит полноценный Query Builder, позволяющий динамически формировать запросы к базе данных.
Главная идея Gormite – разделить ответствености генерации миграций и прикладного кода, чтобы разработчики могли:
Легко описывать структуру таблиц через Go-структуры и теги.
Генерировать SQL-миграции по этим структурам, вводя вручную SQL-код.
Формировать сложные запросы в Go-коде за счёт выразительного Query Builder’а.
go install github.com/KoNekoD/gormite/cmd/gormite@latest
Gormite ищет настройки по умолчанию в директории resources.
resources/gormite.yaml
gormite:
orm:
mapping:
Entities:
dir: pkg/entities
dir – указывает, где хранятся ваши Go-сущности.
Внутри pkg/entities создавайте файлы со структурами, описывающими таблицы БД.
user.go
package entities
import "github.com/KoNekoD/gormite/test/docs_example/pkg/enums"
// User "app_user"
type User struct {
ID int `db:"id" pk:"true"`
Email string `db:"email" uniq:"email" length:"180" uniq_cond:"email:(identity_type = 'email')"`
Phone string `db:"phone" uniq:"phone" length:"10" uniq_cond:"phone:(identity_type = 'phone')"`
IdentityType enums.IdentityType `db:"identity_type" type:"varchar"`
Code *string `db:"code" nullable:"true"`
FullName *string `db:"full_name" default:"'Anonymous'" index:"index_full_name" index_cond:"index_full_name:(is_active = true)"`
IsActive bool `db:"is_active"`
}
type UserProfile struct {
ID int `db:"id" pk:"true"`
User *User `db:"user_id"`
Age int `db:"age"`
}
После того как вы подготовили сущности и YAML-файл, Gormite анализирует структуры и генерирует SQL-миграции, учитывая все настройки из тегов структур, например:
db – название столбца
pk – первичный ключ
nullable – допускается значение NULL
Подробнее можно ознакомиться в документации.
Вторая составляющая Gormite — это высокоуровневый Query Builder, призванный упростить работу с SQL. Он предоставляет полноценный функционал для построения запросов, помогающих строить запросы различной сложности.
Пример использования:
qb := gormite.NewQueryBuilder[entities.User]()
qb.Select("u.id", "u.email").
From("app_user u").
Where("u.is_active = :active").
SetParameter("active", true).
OrderBy("u.id DESC").
SetMaxResults(10)
rows, err := qb.GetResult()
if err != nil {
log.Fatal(err)
}
// rows будет содержать список *entities.User, заполненных из полей "u.id" и "u.email".
Gormite подойдёт тем, кто ищет лёгкий способ автоматизировать миграции и гибко формировать SQL — без лишних обвязок и глубокой интеграции в проект.