gorm中3种常见表关系建表方法 | 青训营笔记

310 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 4 天

马上要开始规划大项目了,在学习gorm的过程中总结一下常见依赖表的创建.

创建一张平平无奇的表

gorm建表默认以ID字段作为主键. 同种类型和他的指针类型在数据库中存储时没有区别,除了原类型不允许有空值null,而指针类型允许.

type Student struct {
  ID    uint
  Name  string
  Email *string
}

字段约束

用结构体tag来约束字段如Name string gorm:"type:varchar(12);size:4". 常见的有:

  • type 定义字段类型
  • size 定义字段大小
  • column 自定义列名
  • primaryKey 将列定义为主键
  • unique 将列定义为唯一键
  • default 定义列的默认值
  • not null 不可为空
  • embedded 嵌套字段
  • embeddedPrefix 嵌套字段前缀
  • comment 注释

创建1对1关系表

例如每个用户有一个详细信息表.注意所有的外键引用要保持数据类型的一致,比如User的ID是size:4,那么UserInfo的UserID必须是size:4.

type User struct {
  ID       uint
  UserInfo UserInfo // 通过这个字段来获取详细信息
}

type UserInfo struct {
  UserID uint // 外键
  ID       uint
  Name     string
  Age      int
  Gender   bool
}

创建1对多关系表

例如一个用户有多篇原创文章.

type User struct {
  ID       uint    
  Name     string    
  Articles []Article // 通过这个字段来获取多篇文章信息
}

type Article struct {
  ID     uint 
  Title  string 
  UserID uint   // 外键
  User   User   // 通过这个字段来反向获取用户信息
}

创建多对多关系表

例如文章和tag的关系,一篇文章有很多的tag,而一个tag也标记了不同的文章.这里必须用标签many2many:article_tags指明多对多关系.

type Tag struct {
  ID       uint
  Name     string
  Articles []Article `gorm:"many2many:article_tags;"` // 用于tag反向引用文章
}

type Article struct {
  ID    uint
  Title string
  Tags  []Tag `gorm:"many2many:article_tags;"` //文章引用tag
}

关于键有关的tag

  • primaryKey 指明主键
  • foreignKey 指明外键
  • joinForeignKey 连接的主键id
  • JoinReferences 关联的主键id