无法使用gorm Postgresql设置外键

时间:2017-10-11 20:53:17

标签: postgresql go go-gorm

我正在使用jinzhu/gorm构建Golang后端,并且我在尝试在两个表之间建立关系时遇到了一些麻烦,例如: 制造商使用外键。

我正在按照jinzhu.me/gorm/models的步骤进行操作,但老实说我发现自己感到困惑的是手动编写表格等更直接的方法,例如,使用go pq

item.go

package model

import "github.com/jinzhu/gorm"

type Item struct {
    gorm.Model
    Item         string       `gorm:"primary_key"`
    Manufacturer Manufacturer `gorm:"ForeignKey:Name"`
}

manufacturer.go

package model

import "github.com/jinzhu/gorm"

type Manufacturer struct {
    gorm.Model
    Name string `gorm:"primary_key"`
}

我没有错误也没有警告。检查我的表我注意到没有创建相关性。商品没有制造商字段。

到目前为止我尝试了什么:

  • 由于gorm:"ForeignKey:Name"字段已经是Manufacturer
  • ,因此未明确撰写Manufacturer
  • 撰写gorm:"ForeignKey:Name;AssociationForeignKey:Name"
  • 将其与db.Model(&model.Item{}).Related(&model.Manufacturer{})
  • 手动关联
  • 将其与db.Model(&model.Item{}).Related(&model.Manufacturer{}, "Manufacturer")
  • 手动关联
  • 手动将它们与db.Model("items").Related("manufacturers")相关联。它们在Postgresql上使用此名称创建,即使它们的模型名称是单数。

修改

尝试类似

的内容
type Item struct {
    Item             string       `gorm:"primary_key"`
    Manufacturer     Manufacturer
    ManufacturerID   int
}

type Manufacturer struct {
    ID uint
    Name string
}

导致相同的结果。没有创建外键,我可以使用不存在的Manufacturer插入新项目。

我做错了什么?我错过了什么吗?

3 个答案:

答案 0 :(得分:1)

您必须执行以下操作:

type Item struct {
    gorm.Model
    Item         string       `gorm:"primary_key"`
    ManufacturerName string   `sql:"type:varchar REFERENCES manufacturers(name)"`
    Manufacturer Manufacturer `gorm:"ForeignKey:ManufacturerName;AssociationForeignKey:Name`
}

告诉它a)使用ManufacturerName作为外键,B)使用另一个表上的Name。

或者你可以这样做:

type Item struct {
    gorm.Model
    Item         string       `gorm:"primary_key"`
    ManufacturerID uint       `sql:"type:uint REFERENCES manufacturers(id)"`
    Manufacturer Manufacturer `gorm:"ForeignKey:Man;AssociationForeignKey:Name"`
}

答案 1 :(得分:0)

在遵循gorm的文档/谷歌搜索/堆栈溢出时,我找不到为之工作的任何解决方案。这是对我有用的东西:

我有一个Call对象和TranscriptItem对象。

一个呼叫可以有许多笔录,但一个转录项只能有一个笔录。

通话对象

type Call struct {
    gorm.Model
    DialInNumber      string

成绩单对象

type TranscriptItem struct {
    gorm.Model
    Transcript string
    CallID     uint
}

我有自动迁移和手动的AddForeignKey迁移

    db.AutoMigrate(&Call{}, &TranscriptItem{})
    db.Model(&TranscriptItem{}).AddForeignKey("call_id", "calls(id)", "RESTRICT", "RESTRICT")

我本来希望使用gorm文档中概述的机制,但最终,我只需要一些有用的东西即可。

答案 2 :(得分:0)

请尝试

    type Item struct {
        Item             string       `gorm:"primary_key"`
        Manufacturer     Manufacturer `gorm:"foreignKey:ManufacturerID;references:id"`
        ManufacturerID   int
    }
    
    type Manufacturer struct {
        ID uint
        Name string
    }

    DB.AutoMigrate(&Item{},&Manufacturer{})

    item := Item{
        Item:         "item",
        Manufacturer: Manufacturer{
            Name:     "name"
        },
    }
    
    DB.Create(&item)