PostgreSQL删除操作恒返回成功时,如何编写语法让sqlc生成返回受影响行数的方法?
让sqlc生成的PostgreSQL DELETE方法返回受影响行数的方案
要让sqlc生成的DELETE操作方法返回(int, error)而非仅error,关键是构造能让sqlc识别到返回数值的SQL语句——也就是让DELETE操作返回受影响的行数。以下是具体实现方式:
核心思路
sqlc根据SQL语句的返回结果生成对应Go方法的返回值:
- 标记为
:exec的DELETE语句,sqlc默认生成仅返回error的方法 - 标记为
:one的查询语句(返回单个整数值),sqlc会生成返回(int64, error)的方法
具体SQL写法
将普通DELETE语句改写为带统计逻辑的查询,通过WITH子句捕获删除的行并统计数量:
-- name: DeleteUser :one WITH deleted_rows AS ( DELETE FROM users WHERE id = $1 RETURNING 1 ) SELECT count(*) FROM deleted_rows;
:one标签指定该语句返回单个结果(即受影响的行数)RETURNING 1用于标记被删除的每一行,后续通过count(*)统计总行数
生成的Go方法示例
sqlc会根据上述SQL生成类似如下的方法:
func (q *Queries) DeleteUser(ctx context.Context, id int) (int64, error) { // 自动生成的执行逻辑 }
如果需要返回int而非int64,可以在sqlc.yaml配置文件中为返回列指定Go类型,或者在业务代码中自行转换。
内容的提问来源于stack exchange,提问作者许家宝
相关产品推荐
相关产品推荐

