外键不是通过一对多关联创建的

时间:2017-09-10 01:28:44

标签: postgresql go go-gorm

我有一个Task类型,其中包含Runner个类型对象的列表。我正在尝试使用golang gorm将其映射到数据库,但它没有外键,我在迁移过程中得到invalid association

我的任务结构:

type Task struct {
    gorm.Model
    Name        string `gorm:"not null;unique_index"`
    Description string
    Runners     []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

上没有创建引用字段

我做错了什么?

1 个答案:

答案 0 :(得分:0)

我有一个类似的问题,我花了很长时间才弄明白。我相信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

为什么你的代码不起作用:

  1. 首先,您需要向Runner结构添加TaskID字段。
  2. db.Model(&Task{}).Related(&Runner{})并不能按照您的想法行事。如果你看一下GORM的代码片段,那么SELECT注释会解释它(虽然不是很好)。该示例假设&user已填充且ID为111,然后它会在&emails中提取与UserID &user匹配的电子邮件。