gorm 表初始化报错、外键报错:define a valid foreign key for relations or implement the Valuer/Scanner interface

gorm外键的规范性写法示例:

type DtProject struct {
	gorm.Model
	Name  string `json:"name" form:"name" gorm:"column:name;comment:;type:varchar(191);"`
}

type DtProjectWorkerRel struct {
	gorm.Model
	ProjectId    uint   `json:"projectId" gorm:"comment:项目id;unique_index:project_company_idcard_idx"`
	Project DtProject `gorm:"foreignKey:ID;references:ProjectId;"`
	}

报错处理思路:

  1. 相信我,一般是foreignKeyreferences哪个单词或符号写错、字段名写错,或者json和gorm中间少了空格之类的。把下面这段复制下来重新改下吧。
    `gorm:"foreignKey:关联表的结构体字段;references:当前表的结构体字段;`
    
  2. 还有,结构体中的字段名要大写
    下面的示例中,projectId这个首字母小写了,也会出现相同的报错
type DtProjectWorkerRel struct {
	gorm.Model
	#这个字段名首字母小写了(私有化),导致gorm无法访问。
	projectId    uint   `gorm:"comment:项目id;unique_index:project_company_idcard_idx"`
	Project DtProject `gorm:"foreignKey:ID;references:ProjectId;"`
	}
  1. 如果还是报错,gorm后面直接用"-"。像下面这样
    
    type UpLoadFile struct {
    	gorm.Model
    	FileName    string    `json:"file_name" gorm:"comment:文件名"`
    	FileChunk   []FileChunk `json:"file_chunk" gorm:"-"`
    }
    
    type FileChunk struct {
    	gorm.Model
    	FileId          uint
    	FileChunkNumber int
    	FileChunkPath   string
    }
    

顺带提一下1:

数据表的初始化顺序,按照逻辑,应当先创建DtProject 表(虽然这个外键功能初始化时是静态的,顺序写乱了也不会报错,但是这方面我认为应当要养成习惯)。

	err := db.AutoMigrate(
	model.DtProject{},
	model.DtProjectWorkerRel{},
	)

顺带提一下2

references:后面跟随的字段名,在gorm文档中是按照生成的数据表中的字段名来写的:
在这里插入图片描述
但是参考gin-vue-admin框架中的写法,references:后面的字段名是跟随结构体驼峰式命名的
在这里插入图片描述
我在测试时,尝试在references:后面使用了数据表中带下划线的字段名结构体中的驼峰式字段名,都没有报错,说明两种方案都是支持的。

评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值