GORM Upsert查询如何配置Returning子句获取更新后的Counter值?
解决GORM Upsert时Returning子句返回指定字段的问题
直接修改代码,启用并正确配置clause.Returning子句即可,具体修正如下:
te := struct { Name string // 主键列 Counter int }{ Name: "name_to_update", Counter: 2, } result := DB. Model(&te). // 指定模型,帮助GORM识别字段映射 Clauses( clause.Returning{Columns: []clause.Column{{Name: "counter"}}}, // 明确指定返回counter列 clause.OnConflict{ Columns: []clause.Column{{Name: "name"}}, // 冲突检测的主键列 DoUpdates: clause.Assignments(map[string]interface{}{ "counter": gorm.Expr("counters.counter + ?", 1), }), }, ).Create(&te) // 执行后,te.Counter会被自动填充为更新后的值 if result.Error == nil { fmt.Println("更新后的counter值:", te.Counter) }
关键说明:
- 启用
clause.Returning并指定Columns: []clause.Column{{Name: "counter"}},强制GORM生成的SQL返回counter列,替代默认返回主键的行为 - 加上
Model(&te)可以让GORM更准确地识别结构体与数据库表的字段映射关系,避免字段匹配异常 - 执行
Create方法后,GORM会将Returning返回的counter值自动填充到传入的te结构体中,直接读取即可获取最新值
修正后生成的SQL会变为:
INSERT INTO "counters" ("counter", "name") VALUES (2, "name_to_update") ON CONFLICT ("name") DO UPDATE SET "counter"=counters.counter + 1 RETURNING "counter"
内容的提问来源于stack exchange,提问作者Jack
相关产品推荐
相关产品推荐

