【问题标题】:Foreign key not created with one to many association未使用一对多关联创建外键
【发布时间】:2017-09-10 01:28:43
【问题描述】:

我有一个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 表上没有创建外键或没有创建引用字段

我做错了什么?

【问题讨论】:

    标签: postgresql go go-gorm


    【解决方案1】:

    我遇到了类似的问题,我花了很长时间才弄明白。我相信 GORM 文档肯定会更好。这里是来自GORM site的相关代码sn-p:

    //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 的代码 sn-p,SELECT 注释可以解释它(虽然不是很好)。该示例假设 &user 已经填充并且 ID 为 111,然后它会获取将它们存储在 &emails 中的与 &userUserID 匹配的电子邮件。

    【讨论】:

      猜你喜欢
      • 2013-06-05
      • 1970-01-01
      • 1970-01-01
      • 2012-08-10
      • 2020-01-15
      • 2020-09-10
      • 1970-01-01
      • 2020-04-24
      • 1970-01-01
      相关资源
      最近更新 更多