-
安装 GORM:
go get -u gorm.io/gorm go get -u gorm.io/driver/sqlite这里以 SQLite 为例
-
导入 GORM:
import ( "gorm.io/gorm" "gorm.io/driver/sqlite" ) -
连接数据库:
db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{}) if err != nil { panic("failed to connect database") } -
定义模型:
type Product struct { gorm.Model Code string Price uint } -
自动迁移: GORM 可以根据模型自动创建数据库表。
db.AutoMigrate(&Product{}) -
创建记录:
db.Create(&Product{Code: "D42", Price: 100}) -
查询记录:
- 通过主键查询:
var product Product db.First(&product, 1) // 根据id查询 - 查询所有记录:
var products []Product db.Find(&products)
- 通过主键查询:
-
更新记录:
- 更新单个字段:
db.Model(&product).Update("Price", 200) - 更新多个字段:
db.Model(&product).Updates(Product{Price: 200, Code: "F42"})
- 更新单个字段:
-
删除记录:
db.Delete(&product, 1) -
复杂查询:
- 条件查询:
db.Where("price > ?", 100).Find(&products) - 链式操作:
db.Where("price > ?", 100).Order("price desc").First(&product)
- 条件查询:
-
事务处理:
tx := db.Begin() // 执行一些数据库操作 if tx.Error != nil { tx.Rollback() } else { tx.Commit() } -
关联查询: 假设有两个模型
User和Profile,它们之间是一对多的关系:type User struct { gorm.Model Profile Profile } type Profile struct { gorm.Model Name string } // 查询用户及其关联的Profile var user User db.Preload("Profile").First(&user, 1)
高级用法
GORM 的高级用法包括但不限于钩子(Hooks)、预加载(Preload)、事务(Transactions)和模型关系(Model Relationships)。以下是这些高级用法的详细介绍:
1. 钩子(Hooks)
钩子允许你在特定的数据库操作之前或之后执行自定义逻辑。GORM 提供了多种钩子,包括 BeforeCreate、AfterCreate、BeforeUpdate、AfterUpdate、BeforeDelete 和 AfterDelete。这些钩子可以在模型上定义为方法,例如:
func (u *User) BeforeCreate(tx *gorm.DB) error {
u.UUID = uuid.New()
if !u.IsValid() {
return errors.New("can't save invalid data")
}
return nil
}
func (u *User) AfterCreate(tx *gorm.DB) error {
if u.ID == 1 {
tx.Model(u).Update("role", "admin")
}
return nil
}
2. 预加载(Preload)
预加载允许你通过单个或多个 SQL 查询直接加载关联数据,减少数据库查询次数。例如,你可以使用 Preload 方法来主动加载关联的数据:
var users []User
db.Preload("Orders").Find(&users)
嵌套预加载也是支持的,例如:
db.Preload("Orders.OrderItems.Product").Preload("CreditCard").Find(&users)
3. 事务(Transactions)
GORM 提供了两种事务处理方法:Transaction 自动事务和 Begin 手动事务。Transaction 方法会在闭包函数执行完毕后自动提交或回滚事务,而 Begin 方法需要你手动管理事务的提交和回滚。
// 使用 Transaction 自动事务
db.Transaction(func(tx *gorm.DB) error {
// 在这里执行数据库操作
return nil
})
// 使用 Begin 手动事务
tx := db.Begin()
// 执行数据库操作
if err := tx.Error; err != nil {
tx.Rollback()
} else {
tx.Commit()
}
4. 模型关系(Model Relationships)
GORM 支持定义模型之间的关系,如属于(Belongs To)、包含一个(Has One)、包含多个(Has Many)和多对多(Many To Many)。这些关系可以通过 Joins 方法进行查询,例如:
type User struct {
gorm.Model
Orders []Order
}
var usersWithOrders []User
db.Joins("JOIN orders ON users.id = orders.user_id").Find(&usersWithOrders)