2017-10-11 107 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