postgresql - 不是用一对多关联创建的外键

标签 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
}

我的 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 表上

我做错了什么?

最佳答案

我有一个类似的问题,我花了很长时间才弄明白。我相信 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. 首先,您需要将一个 TaskID 字段添加到您的 Runner 结构中。
  2. db.Model(&Task{}).Related(&Runner{}) 并不像您认为的那样。如果您查看来自 GORM 的代码片段,SELECT 注释可以解释它(虽然不是很好)。该示例假设 &user 已填充且 ID 为 111,然后它获取将它们存储在与 UserID 匹配的 &emails 中的电子邮件> &用户

关于postgresql - 不是用一对多关联创建的外键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46136500/

相关文章:

postgresql - Postgres 何时以及如何使用 "transactionid"锁

go - 在golang中一键解码多种数据类型

sql - 如何在 gorm 中创建外键?

go - 使用 Delve 调试时将参数传递给可执行文件

postgresql - 使用 Gorm 插入和选择 PostGIS 几何

go - 如何使用 go-sql (postgres) 模拟 gorm 插入

java - Postgres hstore 转换工作错误

java - 如何在竞争条件下将主键值插入表中?

php - pgsql 扩展未加载

Go YAML unmarshal 不会将所有对象结构解码为通用接口(interface)。任何想法为什么?