GORM
Тема дорожной карты · Golang
GORM — наиболее популярный объектно-реляционный маппер (ORM) для Go, предоставляющий гибкий цепочечный API для взаимодействия с PostgreSQL, MySQL, SQLite и SQL Server без необходимости писать сырой SQL для каждой операции. GORM отображает структуры Go на таблицы базы данных с помощью тегов структур (gorm:"primaryKey", gorm:"column:email", gorm:"index"), а функция AutoMigrate может создавать или изменять таблицы в соответствии с текущим определением структуры — удобно для быстрой разработки, хотя и не рекомендуется как единственный инструмент миграций в продакшене. Библиотека поддерживает ассоциации (HasOne, HasMany, BelongsTo, ManyToMany), объявляемые через встраивание структур и соглашения о внешних ключах, и предоставляет хуки (BeforeCreate, AfterSave, BeforeDelete) для внедрения логики в события жизненного цикла. Query builder GORM — db.Where("age > ?", 18).Order("name").Limit(10).Find(&users) — генерирует параметризованный SQL, защищённый от инъекций, а db.Raw(...).Scan(&result) переходит к сырому SQL, когда абстракция ORM недостаточна. Для продакшен Golang-сервисов GORM интегрируется с context.Context через db.WithContext(ctx), обеспечивая отмену запросов, распределённую трассировку с OpenTelemetry и соблюдение таймаутов в соответствии с остальным жизненным циклом запроса.
Как это работает
GORM использует database/sql (интерфейс) + драйвер (pgx для Postgres — также экспонирует свой native-API, go-sql-driver/mysql для MySQL, mattn/go-sqlite3 для SQLite). Connection pool встроен в database/sql. ORM: GORM (популярный, full-featured, opinionated), Ent (Facebook, code-gen based), Bun (sqlx-like), sqlx (расширяет stdlib). Для миграций: golang-migrate, goose, atlas.
Когда применять
По умолчанию сырой database/sql + sqlx для явных запросов; ORM (GORM, Ent) — только если команда реально хочет. pgx напрямую (pgxpool) — для Postgres: лучшая производительность + Postgres-специфика (массивы, JSONB, COPY). Всегда параметризованные запросы ($1/? placeholders). Миграции — через тул, не через Go-код.
Типичные ошибки
Ловушки GORM: SQL-инъекция через fmt.Sprintf в запрос (всегда параметризуйте); утечка *sql.Rows (всегда defer rows.Close()); магия GORM прячет N+1 запросы; не выставлен db.SetMaxOpenConns — исчерпание соединений Postgres; context.Background() вместо контекста запроса (запросы нельзя отменить).