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 作为主键,应用构造体名的 蛇形复数 作为表名,字段名的 蛇形 作为列名,并应用 CreatedAtUpdatedAt 字段追踪创立、更新工夫

遵循 GORM 已有的约定,能够缩小您的配置和代码量。如果约定不合乎您的需要,GORM 容许您自定义配置它们

gorm.Model

GORM 定义一个 gorm.Model 构造体,其包含字段 IDCreatedAtUpdatedAtDeletedAt

// 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 约定应用 CreatedAtUpdatedAt 追踪创立/更新工夫。如果您定义了这种字段,GORM 在创立、更新时会主动填充 以后工夫

要应用不同名称的字段,您能够配置 autoCreateTimeautoUpdateTime 标签

如果您想要保留 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 nullsize, 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依据参数创立索引,多个字段应用雷同的名称则创立复合索引,查看 索引 获取详情
uniqueIndexindex 雷同,但创立的是惟一索引
check创立查看束缚,例如 check:age > 13,查看 束缚 获取详情
<-设置字段写入的权限, <-:create 只创立、<-:update 只更新、<-:false 无写入权限、<- 创立和更新权限
->设置字段读的权限,->:false 无读权限
-疏忽该字段,- 无读写权限
comment迁徙时为字段增加正文

关联标签

GORM 容许通过标签为关联配置外键、束缚、many2many 表,详情请参考 关联局部

原为链接:https://gorm.io/docs/models.html