使用pgx驱动(Golang)获取SQL Count查询结果值的问题
问题
无法将SQL Count查询返回的单个列值扫描到count整数变量中,执行代码后报错:execute query: number of field descriptions must equal number of values, got 1 and 0"
代码如下:
query := ` SELECT COUNT('*') FROM "some-table" WHERE (("state" = 'state') AND ("id" = 1))` rows, err := s.conn.Query(ctx, query) defer rows.Close() var count int err = rows.Scan(&count) if err != nil { return false, fmt.Errorf("execute query: %w", err) }
更新:临时解决代码如下,但不确定是否正确:
count, err := pgx.CollectOneRow(rows, pgx.RowTo[int])
原因与解决方案
错误原因
直接调用rows.Scan前没有调用rows.Next():pgx通过Query返回的结果集,游标初始位置在第一行数据之前,必须先调用rows.Next()将游标移动到有效行,才能执行Scan操作。跳过这一步就会出现字段数和值数不匹配的错误。
另外SQL中的COUNT('*')写法冗余,COUNT(*)是标准的统计行数写法,不过这不是触发错误的直接原因。
标准修复写法
query := ` SELECT COUNT(*) FROM "some-table" WHERE "state" = 'state' AND "id" = 1` rows, err := s.conn.Query(ctx, query) if err != nil { return false, fmt.Errorf("query count: %w", err) } defer rows.Close() var count int // 先移动游标到结果行 if rows.Next() { err = rows.Scan(&count) if err != nil { return false, fmt.Errorf("scan count: %w", err) } } else { // 无匹配行时count设为0 count = 0 } // 检查遍历过程中的潜在错误 if err = rows.Err(); err != nil { return false, fmt.Errorf("rows iteration error: %w", err) }
关于你的临时解决方案
你使用pgx.CollectOneRow的写法是完全正确的。这个方法内部已经封装了游标移动、数据扫描和错误处理的逻辑,专门用于处理单行单列的查询场景,比手动处理rows.Next()更简洁高效,推荐在这类场景下使用。
内容的提问来源于stack exchange,提问作者Archirk
相关产品推荐
相关产品推荐

