如何在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
相关产品推荐
相关产品推荐

