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

