Maison >développement back-end >Golang >golang gorm mise à jour et retour
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
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!