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

Go调用db.Query执行SQL时报sql: expected 1 arguments, got 2错误如何解决

报错排查与解决方案

首先先定位错误的触发位置,你可以分别在db.Query和rows.Scan的错误分支打印错误堆栈,按实际触发位置对应排查:

错误触发在db.Query行

  • 核对你实际运行的SQL语句是否存在占位符:你贴出的代码中SQL无占位符不需要传额外参数,如果你实际代码的SQL写了?/$1这类占位符,要么删除多余的占位符,要么在db.Query的第二个参数位置传入对应数量的匹配参数。
  • 确认db实例的类型:如果你不是直接使用标准库database/sql的*sql.DB实例,而是对数据库操作做了二次封装,或是使用了第三方ORM/数据库工具库,要核对对应Query方法的入参要求,比如部分封装方法只接受1个SQL参数,你多传了额外参数就会触发该报错。

错误触发在rows.Scan行

  • 直接在数据库客户端执行SELECT * FROM posts ORDER BY id DESC,确认查询返回的列数是否和你rows.Scan传入的参数数量完全一致:你现在传入了3个字段指针,如果你的posts表存在其他额外字段(比如创建时间、更新时间、软删标记等),就会出现参数数量不匹配的问题。
  • 建议不要使用SELECT *写法,改为明确指定需要查询的字段,可避免表结构变更后引发的Scan参数不匹配问题,修改后的代码示例:
return func(c echo.Context) error {
    // 明确指定查询字段,和Scan参数一一对应
    rows, err := db.Query("SELECT id, fullname, content FROM posts ORDER BY id DESC")
    if err != nil {
        panic(err)
    }

    defer rows.Close()

    result := PostCollection{}

    for rows.Next() {
        post := Post{}
        err2 := rows.Scan(&post.ID, &post.Fullname, &post.Content)
        if err2 != nil {
            panic(err2)
        }

        result.Posts = append(result.Posts, post)
    }

    return c.JSON(http.StatusOK, result)
}

内容的提问来源于stack exchange,提问作者badman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 10:48:02