gorm标签外键失效

84 篇文章 3 订阅
本文详细介绍了GORM库中如何使用`ForeignKey`标签设置外键以及`AddForeignKey`函数添加外键的用法。通过示例展示了在外键字段类型匹配时正确创建外键的代码,并指出了当`gorm.Model`内嵌时可能出现的问题及解决方案。同时,提供了外键删除和更新时的模式选择。最后,提供了一个完整的数据库迁移示例。
摘要由CSDN通过智能技术生成

踩坑:
看到gorm文档,应该是在tag标签中写入foreignkey可以设置外键,但是不能达到预期效果

type User struct {
	gorm.Model
	LanguagesID  int`gorm:"ForeignKey:Language"`
	//通过标签设置外键,失效,不能映射到数据库中
}

type Language struct {
	gorm.Model
	Name string
}

介绍一个函数

db.Model().AddForeignKey()//需要使用已经存在的表

Model()

db.Model().AddForeignKey()
//Model()函数传入那个表需要的外键
//例如开头的user表和language表,外键在user表中,则需要传入User结构体的地址
db.Model(&User{}).AddForeignKey()

AddForeignKey()
函数需要四个参数:

  1. 外键键名(迁移数据库之后生成的字段名,不是结构体中的字段名)
  2. 关联的外键:关联的表名(字段名),同样都是生成的数据库的表名和字段名
  3. 删除时的状态:set null ,no action,cascade,restrict,其中restrict和no action相同,如果子表有关联数据,父表对应数据不能进行删除,cascade模式:如果删除父表数据,则对应的子表数据也相应删除,set null模式:如果父表删除数据,对应的子表的数据的外键被设置为null,但是相应的这个模式要求子表外键字段可以为null
  4. 更新时表的状态,与删除时的四种状态相同
type User struct {
	gorm.Model
	LanguagesID  int `gorm:"type:int unsigned"`
}

type Language struct {
	gorm.Model
	Name string
}
func migrate(){
	db:=gorm.open("mysql","root:@tcp(:3306)/database?charset=utf8")
	db.AutoMigrate(&Language{},&User{})
	db.Model(&User{}).AddForeignKey("languages_id","languages(id)","CASCADE","CASCADE")
//在user表中生成外键为languages_id字段,对应的外表为languages的id字段languages(id),模式为CASCADE
}

易错点

gorm中有嵌套的gorm.Model结构体,其中有id字段

type User struct {
	gorm.Model
	LanguagesID  int
}

type Language struct {
	gorm.Model
	Name string
}
db.Model(&User{}).AddForeignKey("languages_id", "languages(id)", "RESTRICT", "RESTRICT")
//需要注意,如果这种情况迁移数据库,不会成功
//原因:gorm.Model中的id字段为int unsigned类型,如果两个字段类型不相对应,则不能成为两个表对应字段的外键

更改之后

type User struct {
	gorm.Model
	LanguagesID  int`gorm:"type:int unsigned"`
}

type Language struct {
	gorm.Model
	Name string
}
//此时可以迁移数据库
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值