You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 20:10:25