2017-10-11 12 views
0

私はjinzhu/gormを使用してGolangバックエンドを構築していますが、2つのテーブルの間の関係を設定しようとするといくつか問題があります。 品目および製造元外部キーを使用しています。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"` 
} 

私はエラーや警告なしを取得していません。私のテーブルを調べると、相関関係が作成されていないことに気付きました。アイテムに製造者フィールドがありません。 Manufacturerフィールドが既に手動で手動db.Model(&model.Item{}).Related(&model.Manufacturer{}, "Manufacturer") に関連付けるdb.Model(&model.Item{}).Related(&model.Manufacturer{})

  • に関連付けるgorm:"ForeignKey:Name;AssociationForeignKey:Name"
  • を書くManufacturer
  • あるので、

    • は、明示的にgorm:"ForeignKey:Name"を書いていない:私はこれまで試したどのような

    • と手動で関連付ける。モデルの名前が単数であっても、Postgresqlでこの名前で作成されます。

    EDIT

    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 * to * foreign *に修正するべきです。 – AndreaM16

    +1

    gormは実際に外部キーを作成することにいくつか問題があるようです(https:// github。com/jinzhu/gorm/issues/23)、 'sql'タグを使って実際の鍵を作ることができるようです。自動化する順序を注意して、それが参照するテーブルが既に存在するようにするだけです。 – dave

    関連する問題