带你踩gorm v2的坑-模型关系

Kris_Shin · · 626 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

最近在学习golang, 使用gin框架搭了个网站,于是在网上找golang的orm
找到gorm使用了两天突然发现v2已经发布了,看更新日志说提高了性能修复了很多bug,于是赶紧换了v2,以下纪录我使用gorm v2 踩过的坑

我使用gorm连接的是mysql, 在使用automigrate根据关系模型创建表的时候总是创建失败

首先看官方文档,简单的关联关系,其实理解了官方案例问题就不大.

但是在复杂关系的时候创建就会报错(无法添加外键约束等).这里我提供我自己实验出的一种解决方式:

以我自己的项目为例,假设有User(用户),House(房间),Order(订单)三个表, 无关的属性已经去掉

<pre>type User struct {
gorm.Model // gorm自带, 会提供ID, craeteAt, updateAt, deleteAt四个属性
Property1 int
Property2 string

Houses []*House `gorm:"many2many:user_houses"` // 用户与房间多对多的关系
Orders []Order                                 // 用户与订单一对多的关系

}

type House struct {
gorm.Model
Property1 int
Property2 string

Tenants     []*User     `gorm:"many2many:user_houses;constraint:OnUpdate:CASCADE,OnDelete:SET NULL;"`

}

type Order struct {
gorm.Model
Property1 int
Property2 string

UserID    int
HouseID   int
House    </pre>

精简了很多属性和关联不知道还会不会报错.

创建的时候先屏蔽所有的外键关系然后创建表, 注释之后如下

<pre>type User struct {
gorm.Model // gorm自带, 会提供ID, craeteAt, updateAt, deleteAt四个属性
Property1 int
Property2 string

// Houses []*House `gorm:"many2many:user_houses"` // 用户与房间多对多的关系
// Orders []Order                                 // 用户与订单一对多的关系

}

type House struct {
gorm.Model
Property1 int
Property2 string

// Tenants     []*User     `gorm:"many2many:user_houses;constraint:OnUpdate:CASCADE,OnDelete:SET NULL;"`

}

type Order struct {
gorm.Model
Property1 int
Property2 string

// UserID    int
// HouseID   int
// House    </pre>

相当于每个表都只剩下了gorm.Model和两个Property,请注意在Order表中我注释掉了UserID,HouseID

因为这两个属性虽然是基础类型属性,但是UserID是user表的外键, HouseID是下面House表的外键, 所以说这两个属性也要注释掉

然后你就可以执行db.AutoMigrate(&User{},&House{},&Order{}) 来自动迁移创建你的表;

创建完成之后放开User表的Houses和House表的Tenants, 然后再次执行自动迁移, 就可以创建users表和houses表的多对多关联表;

然后再放开Order的HouseID 和House, 就可以创建orders表对houses表的一对一关系约束;

最后放开User的Orders和Order的UserID, 就可以创建users表对orders表的一对多关系约束;

这样分步创建就不会报错,如果报错的话请检查你的模型是否有问题, 多参考官方给出的案例

还有官网给出的项目gin-vue-admin也可以参考


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:Kris_Shin

查看原文:带你踩gorm v2的坑-模型关系

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

626 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传