这是我参与「第五届青训营 」伴学笔记创作活动的第 6 天
模型定义
模型是标准的 struct,由 Go 的基本数据类型、实现了 Scanner 和 Valuer 接口的自定义类型及其指针或别名组成
例如:
type User struct {
Id int64
Name string
FollowCount int64
FollowerCount int64
IsFollow bool
}
高级选项
字段级权限控制
可导出的字段在使用 GORM 进行 CRUD 时拥有全部的权限,GORM可以设置一些字段来使一个字段有一些特殊的权限,例如只读,只写,忽略等
type User struct {
Name string `gorm:"-"` // 通过 struct 读写会忽略该字段
Name string `gorm:"<-:create"` // 允许读和创建
Name string `gorm:"<-:update"` // 允许读和更新
Name string `gorm:"<-"` // 允许读和写(创建和更新)
Name string `gorm:"<-:false"` // 允许读,禁止写
Name string `gorm:"->"` // 只读(除非有自定义配置,否则禁止写)
Name string `gorm:"->;<-:create"` // 允许读和写
Name string `gorm:"-:all"` // 通过 struct 读写、迁移会忽略该字段
Name string `gorm:"-:migration"` // 通过 struct 迁移会忽略该字段
Name string `gorm:"->:false;<-:create"` // 仅创建(禁止从 db 读)
}
创建 / 更新时间追踪(纳秒、毫秒、秒、Time)
GORM 约定使用 CreatedAt、UpdatedAt 创建 / 更新时间。如果定义了这种字段,GORM 在创建、更新时会自动填充当前时间
要使用不同名称的字段,可以配置 autoCreateTime、autoUpdateTime 标签
如果要保存 UNIX(毫 / 纳)秒时间戳,而不是 time,将 time.Time 修改为 int 即可
type User struct {
CreatedAt time.Time // 在创建时,如果该字段值为零值,则使用当前时间填充
UpdatedAt int // 在创建时该字段值为零值或者在更新时,使用当前时间戳秒数填充
Updated int64 `gorm:"autoUpdateTime:nano"` // 使用时间戳填纳秒数充更新时间
Updated int64 `gorm:"autoUpdateTime:milli"` // 使用时间戳毫秒数填充更新时间
Created int64 `gorm:"autoCreateTime"` // 使用时间戳秒数填充创建时间
}
嵌入结构体
对于匿名字段,GORM 会将其字段包含在父结构体中
type User struct {
gorm.Model
Username string
}
// 等效于
type User struct {
ID uint `gorm:"primaryKey"`
CreatedAt time.Time
UpdatedAt time.Time
DeletedAt gorm.DeletedAt `gorm:"index"`
Username string
}
对于正常的结构体字段,可以通过标签 embedded 将其嵌入
type Author struct {
Username string
Email string
}
type Blog struct {
ID int
Author Author `gorm:"embedded"`
Upvotes int32
}
// 等效于
type Blog struct {
ID int64
Username string
Email string
Upvotes int32
}