ORM для Go (Golang): сравнение и примеры популярных библиотек

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

ORM для Go (Golang): обзор, сравнение и практические примеры

Go (Golang) славится своей производительностью и простотой, но работа с базами данных часто требует написания большого количества шаблонного SQL-кода. ORM (Object-Relational Mapping) библиотеки призваны упростить взаимодействие с БД, автоматизируя маппинг структур Go на таблицы. В этой статье мы рассмотрим три самые популярные ORM для Go: GORM, Ent и SQLBoiler, сравним их по ключевым параметрам и приведём рабочие примеры.

1. GORM — самый популярный ORM для Go

GORM — это полнофункциональная ORM с активным сообществом и огромным количеством возможностей: миграции, хуки, предзагрузка связей, транзакции и многое другое. Она работает по принципу "convention over configuration" и поддерживает большинство популярных СУБД (PostgreSQL, MySQL, SQLite).

Преимущества:

  • Быстрый старт: минимум настроек, автоматическое создание таблиц.
  • Богатая экосистема: плагины, логгеры, валидаторы.
  • Поддержка ассоциаций (Belongs To, Has Many, Many2Many).

Недостатки:

  • Средняя производительность из-за рефлексии и генерации SQL на лету.
  • Сложности с оптимизацией сложных запросов (N+1 проблема).

Пример использования GORM:

package main

import (
    "gorm.io/driver/sqlite"
    "gorm.io/gorm"
)

type User struct {
    ID   uint   `gorm:"primaryKey"`
    Name string `gorm:"size:100"`
    Age  int
}

func main() {
    // Подключение к SQLite
    db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{})
    if err != nil {
        panic("failed to connect database")
    }

    // Автомиграция — создание таблицы
    db.AutoMigrate(&User{})

    // Создание записи
    db.Create(&User{Name: "Иван", Age: 30})

    // Чтение
    var user User
    db.First(&user, 1) // найти по ID
    db.First(&user, "name = ?", "Иван") // найти по условию

    // Обновление
    db.Model(&user).Update("Age", 31)

    // Удаление
    db.Delete(&user)
}

2. Ent — ORM от Facebook с генерацией кода

Ent — это современная ORM, которая генерирует типизированный Go-код на основе схемы данных, описанной в Go-структурах. Она предлагает строгую типизацию, отличную производительность и мощный графовый API для запросов. Ent активно развивается и используется в крупных проектах (например, в самом Facebook).

Преимущества:

  • Генерация кода: ошибки на этапе компиляции, а не в рантайме.
  • Высокая производительность за счёт статического SQL.
  • Удобный API для построения сложных запросов с фильтрацией и сортировкой.

Недостатки:

  • Необходимость установки CLI-инструмента и генерации кода.
  • Более крутая кривая обучения по сравнению с GORM.

Пример использования Ent:

package main

import (
    "context"
    "log"

    "entgo.io/ent/dialect/sqlite"
    "github.com/yourproject/ent"
    "github.com/yourproject/ent/user"
)

func main() {
    // Подключение к SQLite
    client, err := ent.Open("sqlite3", "file:ent.db?cache=shared&_fk=1")
    if err != nil {
        log.Fatalf("failed opening connection to sqlite: %v", err)
    }
    defer client.Close()

    // Автомиграция
    if err := client.Schema.Create(context.Background()); err != nil {
        log.Fatalf("failed creating schema resources: %v", err)
    }

    // Создание пользователя
    createdUser, err := client.User.Create().
        SetName("Пётр").
        SetAge(25).
        Save(context.Background())
    if err != nil {
        log.Fatalf("failed creating user: %v", err)
    }

    // Запрос с фильтрацией
    users, err := client.User.Query().
        Where(user.AgeGT(20)).
        All(context.Background())
    if err != nil {
        log.Fatalf("failed querying users: %v", err)
    }

    log.Printf("Users: %+v", users)
}

3. SQLBoiler — генератор на основе существующей БД

SQLBoiler занимает особое место: он не требует описания схемы в коде. Вы указываете существующую базу данных, и он генерирует типизированные структуры и методы для работы с ней. Это идеальный выбор для проектов с уже готовой схемой БД

Рекомендаций