不是用一对多关联创建的外键
Foreign key not created with one to many association
我有一个 Task
类型,其中包含 Runner
类型对象的列表。我正在尝试使用 golang gorm 将其映射到数据库,但它没有外键,并且我在迁移期间得到 invalid association
我的任务结构:
type Task struct {
gorm.Model
Name string `gorm:"not null;unique_index"`
Description string
Runners []Runner
}
我的 Runner 结构:
type Runner struct {
gorm.Model
Name string `gorm:"not null;unique"`
Description string
}
我的迁移代码:
func migrateSchema () (err error) {
db, err := context.DBProvider()
if err != nil {
return
}
db.Model(&Task{}).Related(&Runner{})
db.AutoMigrate(&Task{})
db.AutoMigrate(&Runner{})
return
}
在 db.AutoMigrate(&Task{})
上,我在控制台中收到 invalid association
消息,当我检查数据库时,在 runners
table[ 上没有创建外键或没有创建参考字段=19=]
我做错了什么?
我遇到了类似的问题,我花了很长时间才弄明白。我相信 GORM 文档肯定会更好。这是 GORM site:
中的相关代码片段
//User has many emails, UserID is the foreign key
type User struct {
gorm.Model
Emails []Email
}
type Email struct {
gorm.Model
Email string
UserID uint
}
db.Model(&user).Related(&emails)
//// SELECT * FROM emails WHERE user_id = 111; // 111 is user's primary key
为什么您的代码不起作用:
- 首先,您需要将一个 TaskID 字段添加到您的 Runner 结构中。
db.Model(&Task{}).Related(&Runner{})
并不像您想象的那样。如果您查看来自 GORM 的代码片段,SELECT 注释可以解释它(虽然不是很好)。该示例假设 &user
已经填充并且 ID 为 111,然后它获取存储在 &emails
中且与 &user
的 UserID
匹配的电子邮件。
我有一个 Task
类型,其中包含 Runner
类型对象的列表。我正在尝试使用 golang gorm 将其映射到数据库,但它没有外键,并且我在迁移期间得到 invalid association
我的任务结构:
type Task struct {
gorm.Model
Name string `gorm:"not null;unique_index"`
Description string
Runners []Runner
}
我的 Runner 结构:
type Runner struct {
gorm.Model
Name string `gorm:"not null;unique"`
Description string
}
我的迁移代码:
func migrateSchema () (err error) {
db, err := context.DBProvider()
if err != nil {
return
}
db.Model(&Task{}).Related(&Runner{})
db.AutoMigrate(&Task{})
db.AutoMigrate(&Runner{})
return
}
在 db.AutoMigrate(&Task{})
上,我在控制台中收到 invalid association
消息,当我检查数据库时,在 runners
table[ 上没有创建外键或没有创建参考字段=19=]
我做错了什么?
我遇到了类似的问题,我花了很长时间才弄明白。我相信 GORM 文档肯定会更好。这是 GORM site:
中的相关代码片段//User has many emails, UserID is the foreign key
type User struct {
gorm.Model
Emails []Email
}
type Email struct {
gorm.Model
Email string
UserID uint
}
db.Model(&user).Related(&emails)
//// SELECT * FROM emails WHERE user_id = 111; // 111 is user's primary key
为什么您的代码不起作用:
- 首先,您需要将一个 TaskID 字段添加到您的 Runner 结构中。
db.Model(&Task{}).Related(&Runner{})
并不像您想象的那样。如果您查看来自 GORM 的代码片段,SELECT 注释可以解释它(虽然不是很好)。该示例假设&user
已经填充并且 ID 为 111,然后它获取存储在&emails
中且与&user
的UserID
匹配的电子邮件。