Table des matières
Contenu de la question
Solution de contournement
Maison développement back-end Golang Clés étrangères dans GORM non mises à jour

Clés étrangères dans GORM non mises à jour

Feb 09, 2024 am 11:57 AM

GORM 中的外键未更新

Lorsque j'utilisais GORM récemment, j'ai trouvé un problème : les clés étrangères n'étaient pas mises à jour. Lorsque j'ai mis à jour la valeur du champ de clé étrangère dans la table associée, elle n'a pas été mise à jour de manière synchrone avec l'autre table. Grâce à des enquêtes et des recherches, j'ai découvert que cela était dû au fait que GORM ne met pas automatiquement à jour les champs de clé étrangère par défaut. Ce problème me dérange depuis un moment, j'ai donc décidé de partager la solution avec tout le monde. Dans cet article, je vais vous montrer comment utiliser GORM pour mettre à jour correctement les champs de clé étrangère afin d'éviter ce problème.

Contenu de la question

J'ai deux bureaux, l'un est une entreprise

1

2

3

4

5

6

type Company struct {

    Id        uuid.UUID `gorm:"column:id;primaryKey;"`

    CreatedAt time.Time `gorm:"index;column:createdAt"`

    UpdatedAt time.Time `gorm:"index;column:updatedAt"`

    Name      string    `gorm:"column:name" binding:"required"`

}

Copier après la connexion

L'autre est product_entitlement

1

2

3

4

5

6

7

8

type ProductEntitlement struct {

ID        uuid.UUID

CreatedAt time.Time `gorm:"index;column:createdAt"`

UpdatedAt time.Time `gorm:"index;column:updatedAt"`

Type       string    `gorm:"column:type" binding:"required"`

CompanyID  uuid.UUID `gorm:"column:companyId;size:36"`

Company    Company   `gorm:"foreignKey:CompanyID"`

}

Copier après la connexion

CompanyID est une clé étrangère. CompanyID contient la valeur de Company.Id

Une fois l'insertion de mise à jour terminée, de nouvelles lignes seront insérées à chaque fois. C'est le code que nous utilisons

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

func UpdateEntitlement(c *gin.Context) {

cid := c.Param("companyId")

    id := c.Param("entitlementId")

    eid := uuid.MustParse(id)

    log.Println(eid)

    uid := uuid.MustParse(cid)

    log.Println(uid)

    var entitlementRequest entities.ProductEntitlement

    if err := c.BindJSON(&entitlementRequest); err != nil {

        log.Println(err)

        fmt.Println("ERROR: ", err)

        c.JSON(400, gin.H{"error": "Invalid JSON format"})

        return

    }

    if err := database.DB.Clauses(clause.OnConflict{

        Columns:   []clause.Column{{Name: "id"}},

        UpdateAll: true,

    }).Create(&entitlementRequest).Error; err != nil {

        log.Println(err)

    }

}

Copier après la connexion

Mais cela échoue toujours et donne une erreur

BD820BD3F94A2A45E18ED8E8094EF395

Je souhaite mettre à jour Product_entitlement si l'ID existe, sinon créez-en un nouveau

L'URL est la suivante, http://localhost:8080/company/{{companyId}}/product/{{companyId}} et utilisez la méthode PUT Le corps est

{"type": "auto"}

Solution de contournement

Si cela aide quelqu'un, nous pouvons utiliser la fonction FirstOrCreate pour vérifier si l'identifiant existe et le mettre à jour, sinon en créer un nouveau.

Pour attribuer une clé étrangère, nous devons attribuer la valeur à la table associée,

entitlementRequest.CompanyID = uid

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

func UpdateEntitlement(c *gin.Context) {

    cid := c.Param("companyId")

    uid := uuid.MustParse(cid)

    eid := c.Param("entitlementId")

    nid := uuid.MustParse(eid)

    var entitlementRequest entities.ProductEntitlement

    entitlementRequest.CompanyID = uid

 

    if err := c.BindJSON(&entitlementRequest); err != nil {

        fmt.Println("ERROR: ", err)

        c.JSON(400, gin.H{"error": "Invalid JSON format"})

        return

    }

    if err := database.DB.Where("id = ?", nid).

        Assign(entitlementRequest).

        FirstOrCreate(&entitlementRequest).Error; err != nil {

        c.JSON(http.StatusBadRequest, gin.H{"error": "Record not found!"})

        return

    }

    c.JSON(http.StatusOK, gin.H{"error": "Product entitlement upserted successfully"})

}

Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Article chaud

Repo: Comment relancer ses coéquipiers
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Combien de temps faut-il pour battre Split Fiction?
3 Il y a quelques semaines By DDD
Hello Kitty Island Adventure: Comment obtenir des graines géantes
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
1 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

Article chaud

Repo: Comment relancer ses coéquipiers
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Combien de temps faut-il pour battre Split Fiction?
3 Il y a quelques semaines By DDD
Hello Kitty Island Adventure: Comment obtenir des graines géantes
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
1 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

Tags d'article chaud

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

GO Language Pack Import: Quelle est la différence entre le soulignement et sans soulignement? GO Language Pack Import: Quelle est la différence entre le soulignement et sans soulignement? Mar 03, 2025 pm 05:17 PM

GO Language Pack Import: Quelle est la différence entre le soulignement et sans soulignement?

Comment mettre en œuvre le transfert d'informations à court terme entre les pages du cadre Beego? Comment mettre en œuvre le transfert d'informations à court terme entre les pages du cadre Beego? Mar 03, 2025 pm 05:22 PM

Comment mettre en œuvre le transfert d'informations à court terme entre les pages du cadre Beego?

Comment écrire des objets et des talons simulés pour les tests en Go? Comment écrire des objets et des talons simulés pour les tests en Go? Mar 10, 2025 pm 05:38 PM

Comment écrire des objets et des talons simulés pour les tests en Go?

Comment puis-je utiliser des outils de traçage pour comprendre le flux d'exécution de mes applications GO? Comment puis-je utiliser des outils de traçage pour comprendre le flux d'exécution de mes applications GO? Mar 10, 2025 pm 05:36 PM

Comment puis-je utiliser des outils de traçage pour comprendre le flux d'exécution de mes applications GO?

Comment convertir la liste des résultats de la requête MySQL en une tranche de structure personnalisée dans le langage Go? Comment convertir la liste des résultats de la requête MySQL en une tranche de structure personnalisée dans le langage Go? Mar 03, 2025 pm 05:18 PM

Comment convertir la liste des résultats de la requête MySQL en une tranche de structure personnalisée dans le langage Go?

Comment rédigez-vous des tests unitaires en Go? Comment rédigez-vous des tests unitaires en Go? Mar 21, 2025 pm 06:34 PM

Comment rédigez-vous des tests unitaires en Go?

Comment écrire des fichiers dans GO Language de manière pratique? Comment écrire des fichiers dans GO Language de manière pratique? Mar 03, 2025 pm 05:15 PM

Comment écrire des fichiers dans GO Language de manière pratique?

Comment puis-je définir des contraintes de type personnalisé pour les génériques en Go? Comment puis-je définir des contraintes de type personnalisé pour les génériques en Go? Mar 10, 2025 pm 03:20 PM

Comment puis-je définir des contraintes de type personnalisé pour les génériques en Go?

See all articles