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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 00:03:17