无法使用gorm设置外键Postgresql
问题描述:
我正在使用jinzhu/gorm构建Golang后端,并且在尝试设置两个表格之间的关系时遇到了一些问题,例如, 项目和制造商使用外键。无法使用gorm设置外键Postgresql
我遵循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")
关联
- 手动将它们与关联。即使它们的模型名称是单数,它们也会在Postgresql上使用该名称创建。
编辑:
试图像
type Item struct {
Item string `gorm:"primary_key"`
Manufacturer Manufacturer
ManufacturerID int
}
type Manufacturer struct {
ID uint
Name string
}
导致了同样的结果。没有外键被创建,我可以插入一个不存在的新项目Manufacturer
。
我在做什么错?我错过了什么吗?
答
你必须做一些事情,如:
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`
}
告诉它一)使用ManufacturerName为外键,和B)使用名称的其他表。
或者,你可以这样做:
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"`
}
它不工作。 'ManufacturerName'获得创建,但它不是一个外键。如果你用'ManufacturerName ='test''插入一个新项目,'Manufacturer'没有'test'项目,它不会引发任何错误。另外,使用PGAdmin,它似乎根本不会创建任何外键约束。无论如何,你应该编辑你的答案修正* foriegn *到* foreign *。 – AndreaM16
看起来gorm在实际创建外键时存在一些问题(根据https:// github。com/jinzhu/gorm/issues/23),但是您似乎可以使用'sql'标签创建实际的密钥 - 您只需要注意自动生成的顺序,以便它所引用的表已经存在。 – dave