详情请查阅gorm文档
模型定义
通常在定义一个gorm的数据库表模型时,会内嵌gorm.Model
类型。
type User struct {
gorm.Model // use gorm.Model
Name string
}
// Model a basic GoLang struct which includes the following fields: ID, CreatedAt, UpdatedAt, DeletedAt
// It may be embedded into your model or you may build your own model without it
// type User struct {
// gorm.Model
// }
type Model struct {
ID uint `gorm:"primarykey"`
CreatedAt time.Time
UpdatedAt time.Time
DeletedAt DeletedAt `gorm:"index"`
}
这个结构体中包含了一些基本的定义,如ID、事件发生时间等信息。
当然我们也可以选择不内嵌该结构,自己去声明这些字段。
type User struct {
ID uint
Name string
Email *string
Age uint8
Birthday *time.Time
MemberNumber sql.NullString
ActivatedAt sql.NullTime
CreatedAt time.Time
UpdatedAt time.Time
}
上述代码片段中,需要注意sql.Nullxxx
类型的字段。String
与sql.NullString
类型在处理空值时(如更新、查询等)会有很大不同,所以这里是有坑的,在涉及到空值处理时需要十分的小心。
关于模型定义的详情参照:https://gorm.io/zh_CN/docs/models.html#embedded_struct
连接数据库
这里主要注意的有以下几点。
连接语句的一些参数的使用,如编码格式,解析,安全性等参数。
dsn := "user:passwd@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"
一些数据库连接自定义配置,如日志,字段长度、精度等。
// 配置日志格式
newLogger := logger.New(
log.New(os.Stdout, "\r\n", log.Lshortfile),
logger.Config{
SlowThreshold: time.Second,
LogLevel: logger.Info,
Colorful: true,
},
)
// 进行数据库的 配置和连接
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{
Logger: newLogger,
DefaultStringSize: 256,
...
})
CRUD
Create
- 通常情况下gorm会自动为我们创建记录的主键,虽然我们并没有显示的指定主键。
- 如果数据量过大,可以使用分批创建,分批大小可以在创建连接时进行配置。
- 在创建的节点可以使用Hook执行特定操作。
- 除了使用结构体、列表进行创建,还可以使用Map创建记录,此外还支持原生的SQL语句
Retrieve
- 需要注意嵌套查询,使用
Preload
、Joins
进行预加载或是链接,或者滞后填充嵌套数据。 - 可以使用SQL语句、结构体字段和map处理查询条件。
- 关于高级的用法请查看文档。
Update
- 注意零值字段的更新,有坑。
Delete
- 注意软删除和永久删除。
一些通用的设定
- 在一些关键的事务操作节点上可以使用Hooks自动执行操作。
多表关联操作
- 注意多表关联的模型关系。
- 关于外键的设置,自定义和重写外键。
- 嵌套查询的预加载和表连接。
- 删除。