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

如何在SQL Boiler中优雅使用Postgres的returning子句实现update/upsert返回字段

SQL Boiler中优雅使用PostgreSQL RETURNING子句的实现方案

SQL Boiler原生支持在DML操作中指定RETURNING子句,无需手动编写原生SQL,常用实现方式如下:

场景1:条件更新单条记录并返回指定字段

对应你的需求,通过查询构造器直接构造更新语句,参数化查询避免SQL注入,字段名使用生成的常量避免拼写错误:

import (
    "你的项目路径/models"
    "github.com/volatiletech/sqlboiler/v4/boil"
    "github.com/volatiletech/sqlboiler/v4/queries/qm"
)

var user models.User

err := models.Users(
    qm.Where(models.UserColumns.Email + " = ?", "test@example.com"),
    qm.Update(models.UserColumns.Name, "test-name"),
    qm.Returning(models.UserColumns.ID),
).Bind(ctx, boil.GetDB(), &user)
if err != nil {
    // 错误处理逻辑
}

// 直接获取返回的用户ID
userId := user.ID

如果需要返回整条记录的全部字段,只需将qm.Returning的参数替换为qm.Returning("*")即可。

场景2:已加载实体的更新并返回最新值

如果你已经提前查询到了对应的User实体对象,可以直接调用实例的Update方法,更贴合ORM使用习惯:

// 提前查询到用户实体
user, err := models.Users(
    qm.Where(models.UserColumns.Email + " = ?", "test@example.com"),
).One(ctx, boil.GetDB())
if err != nil {
    // 错误处理逻辑
}

// 修改实体字段
user.Name = "test-name"

// 执行更新,指定返回字段,更新后结果会自动同步到原实体
err = user.Update(
    ctx, 
    boil.GetDB(), 
    boil.Whitelist(models.UserColumns.Name), // 指定仅更新name字段
    qm.Returning(models.UserColumns.ID),
)
userId := user.ID

场景3:批量更新返回多条结果

如果需要批量更新并返回所有符合条件的记录字段,用切片类型接收返回结果即可:

// 批量将注册超过1年的用户标记为过期,返回所有符合条件的用户ID
var expiredUserIds []int
err := models.Users(
    qm.Where(models.UserColumns.CreatedAt + " < ?", time.Now().AddDate(-1, 0, 0)),
    qm.Update(models.UserColumns.IsExpired, true),
    qm.Returning(models.UserColumns.ID),
).Bind(ctx, boil.GetDB(), &expiredUserIds)

内容的提问来源于stack exchange,提问作者Or Yaacov

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 08:09:03