我正在使用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
插入新项目。
我做错了什么?我错过了什么吗?
答案 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)