2017-10-11 5 views
0

Je construis un backend Golang en utilisant jinzhu/gorm et j'ai quelques problèmes en essayant d'établir une relation entre deux tables, par exemple. Articles et Les fabricants utilisant une clé étrangère. Je suis les étapes au jinzhu.me/gorm/models mais je me suis honnêtement trouvé déconcerté venant d'une approche plus directe d'écrire manuellement des tables etc., par exemple, en utilisant go pq.Impossible de définir la clé étrangère en utilisant gorm Postgresql

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

Je reçois aucune erreur ni avertissement. Inspecter mes tables, j'ai remarqué qu'aucune corrélation n'a été créée. L'article n'a pas de champ Fabricant.

Ce que j'essayé jusqu'à présent:

  • ne pas écrire explicitement gorm:"ForeignKey:Name" depuis Manufacturer domaine est déjà un Manufacturer
  • écriture gorm:"ForeignKey:Name;AssociationForeignKey:Name"
  • les associer manuellement avec db.Model(&model.Item{}).Related(&model.Manufacturer{})
  • les associer manuellement avec db.Model(&model.Item{}).Related(&model.Manufacturer{}, "Manufacturer")
  • Les associer manuellement à db.Model("items").Related("manufacturers"). Ils sont créés avec ce nom sur Postgresql même si le nom de leur modèle est singulier.

EDIT:

Essayer quelque chose comme

type Item struct { 
    Item    string  `gorm:"primary_key"` 
    Manufacturer  Manufacturer 
    ManufacturerID int 
} 

type Manufacturer struct { 
    ID uint 
    Name string 
} 

mène au même résultat. Aucune clé étrangère n'est créée et je suis en mesure d'insérer de nouveaux éléments avec un Manufacturer inexistant.

Qu'est-ce que je fais mal? Est-ce que je manque quelque chose?

Répondre

1

Vous devez faire quelque chose comme:

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

pour lui dire: a) Utiliser ManufacturerName comme la clé étrangère et B) utiliser le nom de l'autre table.

Ou vous pouvez simplement faire:

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

Il ne fonctionne pas. 'ManufacturerName' est créé mais ce n'est pas une clé étrangère. Si vous insérez un nouvel élément avec 'ManufacturerName = 'test'' et' Manufacturer' n'a aucune entrée pour 'test', il ne génère aucune erreur. En outre, en utilisant PGAdmin, il semble ne pas créer de contrainte de clé étrangère. De toute façon, vous devriez éditer votre réponse fixant * foriegn * à * foreign *. – AndreaM16

+1

Il semble que gorm ait quelques problèmes avec la création de la clé étrangère (par https: // github.com/jinzhu/gorm/issues/23), mais il semble que vous pouvez utiliser les balises 'sql' pour créer la clé actuelle - vous devez juste faire attention à l'ordre que vous automatisez afin que la table qu'il référence existe déjà. – dave