首页 > 其他分享 >【Gorm 错误收集】Error 1215 (HY000): Cannot add foreign key constraint

【Gorm 错误收集】Error 1215 (HY000): Cannot add foreign key constraint

时间:2024-02-26 11:24:36浏览次数:29  
标签:... TestCaseStep constraint 1215 db HY000 TestCase type gorm

错误

Error 1215 (HY000): Cannot add foreign key constraint

相关 mysql 错误:Error 1215 (HY000): Cannot add foreign key constraint


场景
为了方便测试人员测试产品的功能以及后续报告,PM设计了一个测试用例的功能,用于记录需要测试的产品的操作步骤。针对这个功能,我建立了两个表,测试用例表TestCase和用例步骤表TestCaseStepTestCase用于记录测试用例的基本信息,TestCaseStep记录该用例的执行步骤。

情况1:引用字段的表结构不存在

代码
测试用例和用例步骤是一对多的关联关系,相关的 Go Gorm 模型大致如下:

type TestCase struct {
	ID                   uint64         `gorm:"primaryKey,autoIncrement;"`
	Name                 string         `gorm:"type:varchar(200);index;default:'';not null"`
	TestCaseSteps        TestCaseSteps  `gorm:"foreignKey:TestCaseID;references:ID;constraint:OnUpdate:CASCADE,OnDelete:CASCADE;" `
}

type TestCaseStep struct {
	ID           uint64         `gorm:"primaryKey,autoIncrement;"`
	TestCaseID   uint64         `gorm:"type:bigint(20) unsigned;index;not null;"`
	Sequece		 int			`gorm:"type:int(10) unsigned;""`
	Detail		 string			`gorm:"type:varchar(2000);"`
	Expectation	 string			`gorm:"type:varchar(2000);"`
}

type TestCaseSteps []*TestCaseStep

这里基本没有什么问题,主要的问题是下面这段数据库迁移的代码:

func GetEntity() []interface{} {
    return []interface{}{
        new(TestCaseStep),
        new(TestCase),
    }
}

// mysql Init:
func Init(db *gorm.DB) {
    ...
    db.AutoMigrate(GetEntity()...)
    ...
}

报出错误Error 1215 (HY000)的代码为db.AutoMigrate(GetEntity()...)

错误出现原因
Gorm v2中方法AutoMigrate()会自动迁移数据表,因此在项目初始化时,它也会自动根据我们自动定义的 orm 模型在数据库中创建对应的表结构。
上述代码db.AutoMigrate(GetEntity()...)实际上可以这样看db.AutoMigrate(new(TestCaseStep),new(TestCase))。它打算先创建TestCaseStep表,再创建TestCase表。问题就出现在这里,TestCaseStep表和TestCase表是多对一的关系,TestCaseStep会将自己的字段TestCaseID作为外键,表TestCase的主键ID作为引用。
由于是先创建的TestCaseStep表,所以表TestCase此时并不存在,所以TestCaseStep无法引用TestCase的主键ID,于是报错:Error 1215 (HY000): Cannot add foreign key constraint。


解决
先创建表TestCase,再创建TestCaseStep

func GetEntity() []interface{} {
    return []interface{}{
        new(TestCase),
        new(TestCaseStep),
    }
}

情况2:引用字段不存在

代码

type TestCase struct {
	ID                   uint64         `gorm:"primaryKey,autoIncrement;"`
	Name                 string         `gorm:"type:varchar(200);index;default:'';not null"`
	TestCaseSteps        TestCaseSteps  `gorm:"foreignKey:TestCaseID;references:TestID;constraint:OnUpdate:CASCADE,OnDelete:CASCADE;" `
}

type TestCaseStep struct {
	ID           uint64         `gorm:"primaryKey,autoIncrement;"`
	TestCaseID   uint64         `gorm:"type:bigint(20) unsigned;index;not null;"` 
    Sequece		 int			`gorm:"type:int(10) unsigned;`
	Detail		 string			`gorm:"type:varchar(2000);`
    Expectation	 string			`gorm:"type:varchar(2000);`
}

type TestCaseSteps []*TestCaseStep

func GetEntity() []interface{} {
    return []interface{}{
        new(TestCaseStep),
        new(TestCase),
    }
}

// mysql Init:
func Init(db *gorm.DB) {
    ...
    db.AutoMigrate(GetEntity()...)
    ...
}

报出错误Error 1215 (HY000)的代码依然为db.AutoMigrate(GetEntity()...)


错误出现原因
Gorm 模型创建外键时引用表TestCase不存在的字段TestID

type TestCase struct {
	...
	TestCaseSteps        TestCaseSteps  `gorm:"foreignKey:TestCaseID;references:TestID;constraint:OnUpdate:CASCADE,OnDelete:CASCADE;" `
}

解决
references引用的字段改为ID

标签:...,TestCaseStep,constraint,1215,db,HY000,TestCase,type,gorm
From: https://www.cnblogs.com/Ayanokoji/p/18028281

相关文章

  • ERROR 2003 (HY000): Can't connect to MySQL server on 'localhost' (10061)
    1.问题在测试Windows上使用多版本Mysql数据库时,windows如何同时安装两个不同版本的Mysql(Mysql8.0+Mysql5.7)mysql-uroot-pn3fsco#ZdR7T在尝试使用DOS连接Mysql数据库发现问题2.原因我这里使用多版本Mysql数据库,该数据库在配置时,为了避免端口号与原数据库冲突,在my.ini中将......
  • CF1697F Too Many Constraints
    题意简述有一个长度为\(n\)的整数序列\(a\),值域为\([1,k]\),有\(m\)条限制:1ix,表示\(a_i\not=x\)2ijx,表示\(a_i+a_j\lex\)3ijx,表示\(a_i+a_j\gex\)试构造一个可能的\(a\),或报告无解。\(n,m\le2\times10^4,k\le10\)。分析看上去像是一个差分约束题,......
  • CF1215F Radio Stations
    一种自认为比较好想、好理解、好写的做法。题意简述有\(n\)个电站,频率范围是\(l_i,r_i(1\lel_i\ler_i\lem)\),有\(m1\)条限制形如\(x,y\),表示\(x,y\)电站至少选一个;同时有\(m2\)条限制形如\(x,y\),表示\(x,y\)电站至多选一个;同时要满足选出的电站的频率范围有交。......
  • [Typescript 5] infer Constraints
    Sincetypescript5,weareabletoaddconstraintsoverinfer.Followingcodedoesn'tapplyconstraints,sotheinferredelementcouldbe stringand numbertypeGetFirstStringIshElement<T>=Textendsreadonly[inferS,..._:any[]]?S:n......
  • abc152F - Tree and Constraints
    abc152F-TreeandConstraints题意:给定一棵树,要求对每条边染成黑色或者白色,其中有m个限制,第i个限制形如ai,bi,表示ai到bi的路径上至少有一条黑色边,求方案数。看到数据第一反应是状压,但是好像没办法搞。于是考虑容斥,能想到容斥的话就差不多做完了,每次标记一下两个点和他们的lc......
  • Mysql报:ERROR 145 (HY000) at line 1: Table './mysq1/proc' is marked as crashed an
    版权声明:原创作品,谢绝转载!否则将追究法律责任。—————作者:kirin先看报错mysq1:[Marning]Usingapasswordonthecommandlineinterfacecanbeinsecure.ERROR145(HY000)atline1:Table'./mysq1/proc'ismarkedascrashedandshouldberepaired1、截图如......
  • 利用topologySpreadConstraints使多个Pod在节点之间均衡调度
    在ingress-nginx部署时有个需求,就是3个节点单个节点需要至少跑3个实例。这需求有点像异地多活时,每个区域至少要跑2实例一样,不同之处是一个是节点级别,一个是区域级别。deployment在副本数多的时候虽然可以让调度器大致上的平均调度,但是当遇到个别节点压力大的时候会降低调度score......
  • 利用topologySpreadConstraints使多个Pod在节点之间均衡调度
    在ingress-nginx部署时有个需求,就是3个节点单个节点需要至少跑3个实例。这需求有点像异地多活时,每个区域至少要跑2实例一样,不同之处是一个是节点级别,一个是区域级别。deployment在副本数多的时候虽然可以让调度器大致上的平均调度,但是当遇到个别节点压力大的时候会降低调度score......
  • MySQL修改安全策略时报错:ERROR 1193 (HY000): Unknown system variable ‘validate_pa
    我使用的版本是MySQL5.73,环境是LinuxCentOS7,其他版本不知道是否可行,望谅解。当我们想设置简单的密码的时候,看了别人发的如何修改安全策略的代码,如下:setglobalvalidate_password_policy=0;setglobalvalidate_password_length=1;但是当我们使用的时候,却报了这样一个......
  • codeblock快捷键+VS code快捷键+DW_minmax文件+莱文斯坦距离+char* 和 char[]区别+可
    codeblock快捷键ctrl+G跳转。ctlr+J生成补全。cygwin用于获得开发环境。注意安装路径要对,特殊字符路径和codeblocks不兼容。codeblock返回上一处:点击光标即可。VScode快捷键ShiftAltF:vscode格式化代码CtrlShiftO:打开函数列表CtrlP:快速打开文件,或者跳到指定行Esc......