Ответ
В Go нет "официальной" или встроенной в стандартную библиотеку ORM (Object-Relational Mapping). Сообщество Go часто придерживается философии явного и простого кода, поэтому многие разработчики предпочитают работать с SQL напрямую. Тем не менее, существует несколько мощных сторонних ORM и альтернативных инструментов.
Популярные ORM-библиотеки
-
GORM (
gorm.io/gorm
)- Описание: Самая популярная и многофункциональная ORM для Go. Поддерживает хуки (hooks), eager loading, транзакции, миграции и имеет большую экосистему плагинов.
-
Пример:
type Product struct { gorm.Model Code string Price uint } db.AutoMigrate(&Product{}) // Автоматическая миграция схемы db.Create(&Product{Code: "D42", Price: 100}) // Создание записи
-
Ent (
entgo.io
)- Описание: ORM от Facebook (Meta). Основная идея — кодогенерация на основе схемы, определенной в коде Go. Это обеспечивает строгую типизацию, безопасность и делает запросы более читаемыми, так как они строятся на основе сгенерированного графа.
Альтернативы ORM (часто предпочитаемые в Go)
Многие Go-разработчики избегают "магии" полноценных ORM в пользу более контролируемых инструментов.
-
database/sql
- Описание: Стандартный пакет для работы с SQL. Предоставляет базовый, но надежный интерфейс для выполнения запросов и сканирования результатов. Требует написания SQL-запросов вручную.
-
sqlx
- Описание: Расширение для
database/sql
, которое упрощает работу. Позволяет сканировать результаты запросов напрямую вstruct
по именам полей, работать с именованными параметрами в запросах и многое другое, при этом не скрывая сам SQL.
- Описание: Расширение для
-
sqlc
- Описание: Генератор кода. Вы пишете чистые SQL-запросы (
CREATE TABLE
,SELECT
,INSERT
), аsqlc
генерирует на их основе типобезопасный Go-код для их выполнения. Это сочетает полный контроль над SQL и безопасность типов.
- Описание: Генератор кода. Вы пишете чистые SQL-запросы (
Вывод: Выбор между ORM и альтернативами зависит от проекта. ORM (как GORM) ускоряют прототипирование и разработку CRUD-операций. Инструменты вроде sqlx
и sqlc
дают больше контроля над производительностью и самим SQL, что соответствует идиоматическому подходу в Go.