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;"`
}
报错处理思路:
- 相信我,一般是
foreignKey
和references
哪个单词或符号写错、字段名
写错,或者json和gorm中间少了空格之类的。把下面这段复制下来重新改下吧。`gorm:"foreignKey:关联表的结构体字段;references:当前表的结构体字段;`
- 还有,结构体中的字段名要大写
下面的示例中,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;"`
}
- 如果还是报错,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:
后面使用了数据表中带下划线的字段名
和结构体中的驼峰式字段名
,都没有报错,说明两种方案都是支持的。