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. 如果还是报错,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文档中是按照生成的数据表中的字段名来写的:
gorm 表初始化报错、外键报错:define a valid foreign key for relations or implement the Valuer/Scanner interface_第1张图片
但是参考gin-vue-admin框架中的写法,references:后面的字段名是跟随结构体驼峰式命名的
gorm 表初始化报错、外键报错:define a valid foreign key for relations or implement the Valuer/Scanner interface_第2张图片
我在测试时,尝试在references:后面使用了数据表中带下划线的字段名结构体中的驼峰式字段名,都没有报错,说明两种方案都是支持的。

你可能感兴趣的:(go,gorm)