Maison >développement back-end >Golang >golang gorm mise à jour et retour

golang gorm mise à jour et retour

PHPz
PHPzavant
2024-02-05 22:06:12576parcourir

golang gorm 更新并返回

Contenu de la question

Dans mon projet golang, j'utilise gorm et je dois faire une requête upsert en utilisant la clause return pour obtenir la valeur modifiée de la requête. Je peux faire un upsert, mais je ne sais pas comment y connecter la clause de retour. Le nom de la table est counters, et le code est le suivant :

te := struct {
        name string //key column
        counter int
    }{
        name: "name_to_update",
        counter: 2,
    }

db.
    //model(te).
    clauses(
        //clause.returning{columns: []clause.column{{name: "counter"}}},
        clause.onconflict{
            columns: []clause.column{{name: "name"}}, // key column
            doupdates: clause.assignments(map[string]interface{}{
                "counter": gorm.expr("counters.counter + ?", 1),
            }),
        },
    ).create(&te)

La requête SQL générée est :

INSERT INTO "counters" ("counter", "name") VALUES (0, "name_to_update") ON CONFLICT ("name") 
DO UPDATE SET "counter"=counters.counter + 1 RETURNING "name" //I need updated counter value here, not name

Le compteur est donc mis à jour, ce qui ne pose pas de problème, mais lorsque j'ai besoin de la valeur mise à jour du compteur, il renvoie la colonne clé (dans le retour). Des idées comment résoudre ce problème? Merci


Bonne réponse


Je ne sais pas si la structure anonyme est à l'origine du problème.

De plus, votre code ne montre pas clairement d'où vient le nom de la table - "compteurs" -.

J'ai essayé votre solution - mais en utilisant une structure dédiée pour le modèle - et elle fonctionne très bien.

type counter struct {
    name    string `gorm:"primarykey"`
    counter int
}

...

counter := counter{name: "name_to_update", counter: 2}

    db.
        clauses(
            clause.returning{columns: []clause.column{{name: "counter"}}},
            clause.onconflict{
                columns: []clause.column{{name: "name"}},
                doupdates: clause.assignments(map[string]interface{}{
                    "counter": gorm.expr("counters.counter + ?", 1),
                }),
            },
        ).create(&counter)

    fmt.println(counter.counter)

Le code ci-dessus génère le sql suivant

INSERT INTO "counters" ("name","counter") VALUES ('name_to_update',10) ON CONFLICT ("name") DO UPDATE SET "counter"=counters.counter + 1 RETURNING "counter"

et counter.counter a la valeur mise à jour correcte.

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:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer