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

golang gorm mise à jour et retour

PHPz
Libérer: 2024-02-05 22:06:12
avant
596 Les gens l'ont consulté

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)
Copier après la connexion

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
Copier après la connexion

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)
Copier après la connexion

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"
Copier après la connexion

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!

source:stackoverflow.com
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal