登录
首页 >  Golang >  Go问答

多对一关系:无法添加或更新父行:外键约束失败

来源:stackoverflow

时间:2024-03-25 17:45:34 462浏览 收藏

在使用 Go 和 GORM 管理多对一关系时,可能会遇到无法添加或更新父行的错误,原因是外键约束失败。对于零对多关系,建议将外键定义在多方模型中,而不是一方模型中。修改后的模型定义将如下所示: **Report 模型:** ```go type Report struct { gorm.Model PersonalDetail PersonalDetail `json:"PersonalDetail" gorm:"foreignkey:ReportId"` } ``` **PersonalDetail 模型:** ```go type PersonalDetail struct { gorm.Model Name string `json:"Name"` Age string `json:"Age"` ReportId uint `sql:"type:bigint REFERENCES reports(id) ON DELETE CASCADE"` } ```

问题内容

我是 go 和 gorm 的新手。我想解析 api 响应并存储两个表。 对于每个“reports”表,可以有零到多个“personal_details”表。

但是,gorm 在应用外键约束时会出错,因为有时 api 响应中没有 personaldetail 的记录。

我遵循 gorm 文档并尝试了多关系,但我认为它不适用于零对多关系

db.Model(&Report{}).AddForeignKey("personal_detail_id", "personal_details(id)", "RESTRICT", "RESTRICT")

type Report struct{
  gorm.Model
  PersonalDetail PersonalDetail `json:"PersonalDetail" gorm:"foreignkey:PersonalDetailId"`
  PersonalDetailId uint
}

type PersonalDetail struct{
  gorm.Model
  Name string `json:"Name"`
  Age string `json:"Age"`

解决方案


尝试像这样定义你的模型:

type Report struct {
  gorm.Model
  PersonalDetail PersonalDetail `json:"PersonalDetail" gorm:"foreignkey:ReportId"`
}

type PersonalDetail struct {
  gorm.Model
  Name string `json:"Name"`
  Age string `json:"Age"`
  ReportId uint `sql:"type:bigint REFERENCES reports(id) ON DELETE CASCADE"`
}

我在让外键在 gorm 中工作时遇到了一些麻烦,所以我发现使用 sql 标签来定义关系似乎效果更好。它不太干净,因为您需要定义实际的数据库名称而不是字段名称,但它可以工作。

还要记住迁移表的顺序。您可能需要按顺序执行此操作,以便不会引用尚未创建的表。对于本示例,请在 personaldetail 之前迁移 reports

本篇关于《多对一关系:无法添加或更新父行:外键约束失败》的介绍就到此结束啦,但是学无止境,想要了解学习更多关于Golang的相关知识,请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>