乐趣区

关于golang:gorm声明模型

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

关联标签

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

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

退出移动版