共计 3221 个字符,预计需要花费 9 分钟才能阅读完成。
gorm 申明模型
本文视频教程:https://www.bilibili.com/vide…
模型定义
模型是规范的 struct,由 Go 的根本数据类型、实现了 Scanner 和 Valuer 接口的自定义类型及其指针或别名组成
例如:
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
}
约定
GORM 偏向于约定,而不是配置。默认状况下,GORM 应用 ID
作为主键,应用构造体名的 蛇形复数
作为表名,字段名的 蛇形
作为列名,并应用 CreatedAt
、UpdatedAt
字段追踪创立、更新工夫
遵循 GORM 已有的约定,能够缩小您的配置和代码量。如果约定不合乎您的需要,GORM 容许您自定义配置它们
gorm.Model
GORM 定义一个 gorm.Model
构造体,其包含字段 ID
、CreatedAt
、UpdatedAt
、DeletedAt
// gorm.Model 的定义
type Model struct {
ID uint `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
Updated int64 `gorm:"autoUpdateTime:nano"` // Use unix nano seconds as updating time
Updated int64 `gorm:"autoUpdateTime:milli"`// Use unix milli seconds as updating time
Created int64 `gorm:"autoCreateTime"` // Use unix seconds as creating time
}
嵌入构造体
对于匿名字段,GORM 会将其字段蕴含在父构造体中,例如:
type User struct {
gorm.Model
Name string
}
// 等效于
type User struct {
ID uint `gorm:"primaryKey"`
CreatedAt time.Time
UpdatedAt time.Time
DeletedAt gorm.DeletedAt `gorm:"index"`
Name string
}
对于失常的构造体字段,你也能够通过标签 embedded
将其嵌入,例如:
type Author struct {
Name string
Email string
}
type Blog struct {
ID int
Author Author `gorm:"embedded"`
Upvotes int32
}
// 等效于
type Blog struct {
ID int64
Name string
Email string
Upvotes int32
}
并且,您能够应用标签 embeddedPrefix
来为 db 中的字段名增加前缀,例如:
type Blog struct {
ID int
Author Author `gorm:"embedded;embeddedPrefix:author_"`
Upvotes int32
}
// 等效于
type Blog struct {
ID int64
AuthorName string
AuthorEmail string
Upvotes int32
}
字段标签
申明 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