fix(仓储): 规范 rows.Close 错误回传

统一 usage_log_repo 查询的 Close 错误处理,避免\n成功路径吞掉关闭失败

scanSingleRow 使用 errors.Join 合并 Close 错误,\n保留 ErrNoRows 可判定

测试: make -C backend test-unit
This commit is contained in:
yangjianbo
2025-12-30 17:13:32 +08:00
parent 7e758b24c4
commit 8cb2d3b352
2 changed files with 125 additions and 42 deletions

View File

@@ -3,14 +3,16 @@ package repository
import (
"context"
"database/sql"
"errors"
)
type sqlQueryer interface {
QueryContext(ctx context.Context, query string, args ...any) (*sql.Rows, error)
}
// scanSingleRow executes a query and scans the first row into dest.
// If no rows are returned, sql.ErrNoRows is returned.
// scanSingleRow 执行查询并扫描第一行到 dest
// 若无结果,可通过 errors.Is(err, sql.ErrNoRows) 判断。
// 如果 Close 失败,会与原始错误合并返回。
// 设计目的:仅依赖 QueryContext避免 QueryRowContext 对 *sql.Tx 的强绑定,
// 让 ent.Tx 也能作为 sqlExecutor/Queryer 使用。
func scanSingleRow(ctx context.Context, q sqlQueryer, query string, args []any, dest ...any) (err error) {
@@ -19,8 +21,8 @@ func scanSingleRow(ctx context.Context, q sqlQueryer, query string, args []any,
return err
}
defer func() {
if closeErr := rows.Close(); closeErr != nil && err == nil {
err = closeErr
if closeErr := rows.Close(); closeErr != nil {
err = errors.Join(err, closeErr)
}
}()