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
相关产品推荐
相关产品推荐

