gorm声明模型
本文视频教程:https://www.bilibili.com/vide...
模型定义
模型是标准的 struct,由 Go 的基本数据类型、实现了 Scanner 和 Valuer 接口的自定义类型及其指针或别名组成
【gorm声明模型】例如:
type User struct {
IDuint
Namestring
Email*string
Ageuint8
Birthday*time.Time
MemberNumber sql.NullString
ActivatedAtsql.NullTime
CreatedAttime.Time
UpdatedAttime.Time
}
约定 GORM 倾向于约定,而不是配置。默认情况下,GORM 使用
ID
作为主键,使用结构体名的 蛇形复数
作为表名,字段名的 蛇形
作为列名,并使用 CreatedAt
、UpdatedAt
字段追踪创建、更新时间遵循 GORM 已有的约定,可以减少您的配置和代码量。如果约定不符合您的需求,GORM 允许您自定义配置它们
gorm.Model GORM 定义一个
gorm.Model
结构体,其包括字段 ID
、CreatedAt
、UpdatedAt
、DeletedAt
// gorm.Model 的定义
type Model struct {
IDuint`gorm:"primaryKey"`
CreatedAt time.Time
UpdatedAt time.Time
DeletedAt gorm.DeletedAt `gorm:"index"`
}
您可以将它嵌入到您的结构体中,以包含这几个字段,详情请参考 嵌入结构体
高级选项 字段级权限控制
可导出的字段在使用 GORM 进行 CRUD 时拥有全部的权限,此外,GORM 允许您用标签控制字段级别的权限。这样您就可以让一个字段的权限是只读、只写、只创建、只更新或者被忽略
注意: 使用 GORM Migrator 创建表时,不会创建被忽略的字段
type User 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:"->:false;
<-:create"` // 仅创建(禁止从 db 读)
Name string `gorm:"-"`// 通过 struct 读写会忽略该字段
}
创建/更新时间追踪(纳秒、毫秒、秒、Time)
GORM 约定使用
CreatedAt
、UpdatedAt
追踪创建/更新时间。如果您定义了这种字段,GORM 在创建、更新时会自动填充 当前时间要使用不同名称的字段,您可以配置
autoCreateTime
、autoUpdateTime
标签如果您想要保存 UNIX(毫/纳)秒时间戳,而不是 time,您只需简单地将
time.Time
修改为 int
即可type User struct {
CreatedAt time.Time // Set to current time if it is zero on creating
UpdatedAt int// Set to current unix seconds on updating or if it is zero on creating
Updatedint64 `gorm:"autoUpdateTime:nano"` // Use unix nano seconds as updating time
Updatedint64 `gorm:"autoUpdateTime:milli"`// Use unix milli seconds as updating time
Createdint64 `gorm:"autoCreateTime"`// Use unix seconds as creating time
}
嵌入结构体
对于匿名字段,GORM 会将其字段包含在父结构体中,例如:
type User struct {
gorm.Model
Name string
}
// 等效于
type User struct {
IDuint`gorm:"primaryKey"`
CreatedAt time.Time
UpdatedAt time.Time
DeletedAt gorm.DeletedAt `gorm:"index"`
Name string
}
对于正常的结构体字段,你也可以通过标签
embedded
将其嵌入,例如:type Author struct {
Namestring
Email string
}type Blog struct {
IDint
AuthorAuthor `gorm:"embedded"`
Upvotes int32
}
// 等效于
type Blog struct {
IDint64
Namestring
Email string
Upvotesint32
}
并且,您可以使用标签
embeddedPrefix
来为 db 中的字段名添加前缀,例如:type Blog struct {
IDint
AuthorAuthor `gorm:"embedded;
embeddedPrefix:author_"`
Upvotes int32
}
// 等效于
type Blog struct {
IDint64
AuthorNamestring
AuthorEmail string
Upvotesint32
}
字段标签
声明 model 时,tag 是可选的,GORM 支持以下 tag: tag 名大小写不敏感,但建议使用
camelCase
风格标签名 | 说明 |
---|---|
column | 指定 db 列名 |
type | 列数据类型,推荐使用兼容性好的通用类型,例如:所有数据库都支持 bool、int、uint、float、string、time、bytes 并且可以和其他标签一起使用,例如:not null 、size , autoIncrement … 像 varbinary(8) 这样指定数据库数据类型也是支持的。在使用指定数据库数据类型时,它需要是完整的数据库数据类型,如:MEDIUMINT UNSIGNED not NULL AUTO_INCREMENT |
size | 指定列大小,例如:size:256 |
primaryKey | 指定列为主键 |
unique | 指定列为唯一 |
default | 指定列的默认值 |
precision | 指定列的精度 |
scale | 指定列大小 |
not null | 指定列为 NOT NULL |
autoIncrement | 指定列为自动增长 |
autoIncrementIncrement | 自动步长,控制连续记录之间的间隔 |
embedded | 嵌套字段 |
embeddedPrefix | 嵌入字段的列名前缀 |
autoCreateTime | 创建时追踪当前时间,对于 int 字段,它会追踪秒级时间戳,您可以使用 nano /milli 来追踪纳秒、毫秒时间戳,例如:autoCreateTime:nano |
autoUpdateTime | 创建/更新时追踪当前时间,对于 int 字段,它会追踪秒级时间戳,您可以使用 nano /milli 来追踪纳秒、毫秒时间戳,例如:autoUpdateTime:milli |
index | 根据参数创建索引,多个字段使用相同的名称则创建复合索引,查看 索引 获取详情 |
uniqueIndex | 与 index 相同,但创建的是唯一索引 |
check | 创建检查约束,例如 check:age > 13 ,查看 约束 获取详情 |
<- | 设置字段写入的权限, <-:create 只创建、<-:update 只更新、<-:false 无写入权限、<- 创建和更新权限 |
-> | 设置字段读的权限,->:false 无读权限 |
- | 忽略该字段,- 无读写权限 |
comment | 迁移时为字段添加注释 |
GORM 允许通过标签为关联配置外键、约束、many2many 表,详情请参考 关联部分
原为链接:https://gorm.io/docs/models.html
推荐阅读
- 【golang】leetcode中级-字母异位词分组&无重复字符的最长子串
- 彻底理解Golang Map
- kratos线上开源年会它来啦~
- 深入浅出 Golang 资源嵌入方案(go-bindata篇)
- 深入浅出 Golang 资源嵌入方案(前篇)
- golang 经典案例总结
- Go实战 | 基于有向无环图的并发执行流的实现
- Golang 数组和切片
- Go JSON编码与解码()
- golang map基础知识