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

如何获取UPDATE语句影响的行数及查询返回值?

同时获取UPDATE语句的受影响行数与RETURNING返回值的方法

你当前用ExecContext执行带RETURNING的UPDATE语句,只能拿到受影响行数,是因为ExecContext的设计目标是处理不返回结果集的语句。要同时获取返回值和受影响行数,改用QueryContext执行语句即可,具体实现如下:

通用代码示例(支持多行影响)

sqlStatement := `UPDATE "my_table" SET "column1" = $1 WHERE "column2" = $2 RETURNING "column3"`

// 使用QueryContext替代ExecContext,获取语句返回的结果集
rows, err := db.QueryContext(ctx, sqlStatement, args...)
if err != nil {
    // 处理语句执行错误
}
defer rows.Close() // 确保结果集最终被关闭,避免资源泄漏

// 收集RETURNING子句返回的column3值
var returnedColumn3 []string // 根据column3的实际数据类型调整变量类型
for rows.Next() {
    var val string
    if err := rows.Scan(&val); err != nil {
        // 处理字段扫描错误
    }
    returnedColumn3 = append(returnedColumn3, val)
}

// 检查遍历结果集过程中是否出现错误
if err := rows.Err(); err != nil {
    // 处理遍历错误
}

// 获取受影响的行数,需在遍历完结果集后调用
affectedRows, err := rows.RowsAffected()
if err != nil {
    // 处理获取行数错误
}

// 此时可使用returnedColumn3(返回值列表)和affectedRows(受影响行数)

关键说明

  • QueryContext适用于带RETURNING子句的DML语句,这类语句会返回结果集,而ExecContext仅返回受影响行数,不处理结果集。
  • 若确定UPDATE语句只会影响单行,可以简化遍历逻辑,只调用一次rows.Next()和Scan()。
  • 不同数据库驱动对RowsAffected()的支持有差异,PostgreSQL的主流驱动(如pgx、lib/pq)均支持该方法,但必须在遍历完结果集后调用,否则可能返回错误或无效值。

单行影响简化版示例

如果你的UPDATE语句只会修改一行数据,代码可以更简洁:

sqlStatement := `UPDATE "my_table" SET "column1" = $1 WHERE "column2" = $2 RETURNING "column3"`

rows, err := db.QueryContext(ctx, sqlStatement, args...)
if err != nil {
    // 处理错误
}
defer rows.Close()

var returnedVal string
var affectedRows int64

// 读取单行返回值
if rows.Next() {
    if err := rows.Scan(&returnedVal); err != nil {
        // 处理扫描错误
    }
}

// 检查遍历过程中的错误
if err := rows.Err(); err != nil {
    // 处理错误
}

// 获取受影响行数
affectedRows, err = rows.RowsAffected()
if err != nil {
    // 处理错误
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 00:22:32