Фантастическая библиотека ORM для Golang призвана быть дружелюбной к разработчикам.
Обзор
Полнофункциональный ORM
Связи (Has One (имеет одну), Has Many (имеет много), Belongs To (принадлежит), Many To Many (многие ко многим), Polymorphism (полиморфизм), Single-table inheritance (одно табличное представление))
Хуки (До/После Создать/Сохранить/Обновить/Удалить/Найти)
Нетерпеливая загрузка с помощью Preload
, Joins
Транзакции, вложенные транзакции, точки сохранения, откат к сохраненной точке
Context, Prepared Statement Mode, DryRun Mode
Batch Insert, FindInBatches, Find/Create with Map, CRUD with SQL Expr and Context Valuer
SQL Builder, Upsert, Locking, Optimizer/Index/Comment Hints, Named Argument, SubQuery
Композитный первичный ключ, Индексы, Зависимости
Автомиграция
Logger
Generics API for type-safe queries and operations
Extendable, flexible plugin API: Database Resolver (multiple databases, read/write splitting) / Prometheus…
Каждая функция поставляется с тестами
Дружелюбная к разработчикам
Установка go get -u gorm.io/gorm go get -u gorm.io/driver/sqlite
Быстрый старт Generics API (>= v1.30.0) package mainimport ( "context" "gorm.io/driver/sqlite" "gorm.io/gorm" ) type Product struct { gorm.Model Code string Price uint } func main () { db, err := gorm.Open(sqlite.Open("test.db" ), &gorm.Config{}) if err != nil { panic ("failed to connect database" ) } ctx := context.Background() db.AutoMigrate(&Product{}) err = gorm.G[Product](db).Create(ctx, &Product{Code: "D42" , Price: 100 }) product, err := gorm.G[Product](db).Where("id = ?" , 1 ).First(ctx) products, err := gorm.G[Product](db).Where("code = ?" , "D42" ).Find(ctx) err = gorm.G[Product](db).Where("id = ?" , product.ID).Update(ctx, "Price" , 200 ) err = gorm.G[Product](db).Where("id = ?" , product.ID).Updates(ctx, map [string ]interface {}{"Price" : 200 , "Code" : "F42" }) err = gorm.G[Product](db).Where("id = ?" , product.ID).Delete(ctx) }
Traditional API package mainimport ( "gorm.io/driver/sqlite" "gorm.io/gorm" ) type Product struct { gorm.Model Code string Price uint } func main () { db, err := gorm.Open(sqlite.Open("test.db" ), &gorm.Config{}) if err != nil { panic ("failed to connect database" ) } db.AutoMigrate(&Product{}) db.Create(&Product{Code: "D42" , Price: 100 }) var product Product db.First(&product, 1 ) db.First(&product, "code = ?" , "D42" ) db.Model(&product).Update("Price" , 200 ) db.Model(&product).Updates(Product{Price: 200 , Code: "F42" }) db.Model(&product).Updates(map [string ]interface {}{"Price" : 200 , "Code" : "F42" }) db.Delete(&product, 1 ) }