golang

Удобная ORM для Go с генерацией миграций и Query Builder’ом: Gormite

  • среда, 12 февраля 2025 г. в 00:00:10
https://habr.com/ru/articles/881370/

GitHub

В процессе разработки на Go нередко встаёт вопрос о создании удобного уровня абстракции для работы с базой данных: хочется иметь и простую генерацию миграций, и гибкий Query Builder. Проект Gormite был создан как раз для решения этих задач. Он предлагает облегчённый подход к ORM, при этом сохраняя гибкость при формировании SQL-запросов.

Знакомство с Gormite

Gormite – это CLI-инструмент, которая не нуждается в прямой интеграции в go.mod. Она читает конфигурацию (mapping) из YAML-файла и по указанным в нём entities генерирует миграции для базы данных. Дополнительно в Gormite входит полноценный Query Builder, позволяющий динамически формировать запросы к базе данных.

Главная идея Gormite – разделить ответствености генерации миграций и прикладного кода, чтобы разработчики могли:

  1. Легко описывать структуру таблиц через Go-структуры и теги.

  2. Генерировать SQL-миграции по этим структурам, вводя вручную SQL-код.

  3. Формировать сложные запросы в Go-коде за счёт выразительного Query Builder’а.

Установка и настройка генератора миграций

Шаг 1. Установить Gormite

go install github.com/KoNekoD/gormite/cmd/gormite@latest

Шаг 2. Создать конфигурационный файл gormite.yaml

Gormite ищет настройки по умолчанию в директории resources.

resources/gormite.yaml

gormite:  
  orm:    
    mapping:      
      Entities:
        dir: pkg/entities
  • dir – указывает, где хранятся ваши Go-сущности.

Шаг 3. Подготовить сущности

Внутри 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

Подробнее можно ознакомиться в документации.

Query Builder

Вторая составляющая 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 — без лишних обвязок и глубокой интеграции в проект.

GitHub

Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.
После прочтения, хочу
18.75% *кинуть респект*3
81.25% *кинуть помидор или что-нибудь потяжелее*13
Проголосовали 16 пользователей. Воздержались 3 пользователя.