GORM 知识点入门
GORM 知识点入门
一、模型定义与约定
模型结构
在 GORM 中,模型通过 Go 结构体进行定义,字段支持多种数据类型,包括基本数据类型、time.Time
以及实现了 Scanner/Valuer
接口的自定义类型。默认情况下,使用 ID
作为主键。表名会自动转换为结构体名的蛇形复数形式,例如 UserInfo
会映射为 user_infos
。字段名则会转换为蛇形命名,比如 CreatedAt
会转为 created_at
。
标签控制
通过结构体标签,我们可以实现字段级的权限控制,例如设置字段为只读或忽略迁移。此外,还可以指定默认值、创建索引以及设置外键关联等。例如:
type User struct {Name string `gorm:"<-:create"` // 仅允许创建时写入Age int `gorm:"default:18"` // 默认值
}
标签还支持自动时间追踪功能(如 autoCreateTime
和 autoUpdateTime
)以及软删除功能(通过 gorm.DeletedAt
实现)。
二、数据库连接与配置
连接方式
GORM 支持多种数据库,通过 DSN(数据源名称)进行连接。以下是连接 MySQL 的示例:
dsn := "user:pass@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
在连接时,需注意时区设置(如 loc=Local
)和解析时间参数(parseTime=True
)。
连接池优化
为了提升性能,我们可以通过 sql.DB
设置连接池参数,包括最大空闲连接数、最大打开连接数以及连接的复用时间等。
三、CRUD 操作
创建(Create)
- 单条插入 :
db.Create(&user)
- 批量插入 :
db.CreateInBatches(&users, 100)
,支持事务和回填主键。 - 指定字段插入 :
db.Select("Name").Create(&user)
或忽略字段db.Omit("Age")
。
查询(Read)
- 基础查询 :使用
First
(按主键查询)、Find
(多条件查询)、Where
(条件筛选)等方法。 - 预加载关联数据 :
db.Preload("Comments").Find(&posts)
,可避免 N + 1 查询问题。 - 链式操作 :支持
Order
、Limit
、Group
等,如db.Where("age > ?", 20).Order("id desc")
。
更新(Update)
- 单字段更新 :
db.Model(&user).Update("Name", "NewName")
。 - 多字段更新 :
Updates(map[string]interface{}{"Name": "Alice", "Age": 25})
,需要注意的是,若字段值为零值,需使用Select
显式指定。
删除(Delete)
- 软删除 :默认使用
DeletedAt
字段进行标记,如需物理删除,可通过Unscoped().Delete()
实现。 - 条件删除 :
db.Where("age < ?", 18).Delete(&User{})
。
四、高级功能
事务处理
可以使用 db.Transaction(func(tx *gorm.DB) error { ... })
来封装事务,它支持嵌套事务以及保存点功能。
钩子(Hooks)
在 CRUD 操作前后,可以触发自定义逻辑。例如,利用 BeforeCreate
、AfterUpdate
等钩子进行数据校验或记录日志。
关联与预加载
GORM 支持一对一、一对多、多对多等多种关联关系。通过 Preload
预加载关联数据,能够有效减少查询次数。
性能优化
- 关闭默认事务 :设置
SkipDefaultTransaction: true
。 - 预编译语句 :启用
PrepareStmt: true
来缓存 SQL 语句。 - 调试模式 :使用
db.Debug().Find(&users)
输出实际执行的 SQL 语句,方便进行调试和性能分析。
五、注意事项
零值处理
在使用结构体进行查询时,零值字段(如 0
、""
)会被忽略。若要包含这些条件,需改用 map
或 Select
进行显式指定。
错误处理
需要检查 result.Error
,部分操作(如 First
查询无结果)可能会返回 ErrRecordNotFound
错误。
指针与值类型
在进行关联查询时,要注意区分指针和值类型,以免出现空指针异常。
扩展资源
- 插件与扩展 :GORM 支持 Prometheus 监控、多数据库读写分离(Database Resolver)等功能。
- 迁移工具 :
AutoMigrate
可自动同步模型与表结构,但对于复杂的变更,建议手动处理。
更详细的可以看Gorm中文文档:https://gorm.io/zh_CN/docs/index.html