2017-10-11 80 views
0

我正在使用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

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

回答

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` 
} 

告诉它一)使用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"` 
} 
+0

它不工作。 'ManufacturerName'获得创建,但它不是一个外键。如果你用'ManufacturerName ='test''插入一个新项目,'Manufacturer'没有'test'项目,它不会引发任何错误。另外,使用PGAdmin,它似乎根本不会创建任何外键约束。无论如何,你应该编辑你的答案修正* foriegn *到* foreign *。 – AndreaM16

+1

看起来gorm在实际创建外键时存在一些问题(根据https:// github。com/jinzhu/gorm/issues/23),但是您似乎可以使用'sql'标签创建实际的密钥 - 您只需要注意自动生成的顺序,以便它所引用的表已经存在。 – dave