恐慌:sql:预期0参数,得到1

时间:2019-06-16 19:33:43

标签: mysql sql go

我正在尝试使用Go执行查询,但是我无法设法请求任何查询,因为它不断给我同样的错误。

我多次更改了查询,但这似乎无济于事。 我也更改了Query中的QueryRow,不幸的是,这也无济于事。

func test123() {

    db, err := sql.Open("mysql", "root:password@tcp(127.0.0.1:3306)/vitaintellectdb")
    if err != nil {
        panic(err.Error())
    }

    id := 1
    var col string
    sqlStatement := `SELECT naam FROM medewerker WHERE naam="jansen"`
    row := db.QueryRow(sqlStatement, id)
    err2 := row.Scan(&col)
    if err2 != nil {
        if err2 == sql.ErrNoRows {
            fmt.Println("Zero rows found")
        } else {
            panic(err2)
        }
    }

}

QueryRow旨在为您提供1行作为回报。不幸的是,该错误告诉我应该没有退货,我希望退回1行。

3 个答案:

答案 0 :(得分:2)

sqlStatement := `SELECT naam FROM medewerker WHERE naam="jansen"`
row := db.QueryRow(sqlStatement, id)

给定的sql语句没有参数。以下sql语句(包括占位符)可能会更好。

sqlStatement := `SELECT naam FROM medewerker WHERE medewerkernummer =?`
row := db.QueryRow(sqlStatement, id)

根据id列的命名方式,您可能必须将naam=?更改为idColumn=?。在示例here中,您可能会找到灵感。

答案 1 :(得分:1)

该错误告诉您您正在向QueryRow传递参数,这是不期望的。

您的SQL语句没有任何占位符,因此不会有任何占位符,但是您将其赋予id之一。只需更改:

row := db.QueryRow(sqlStatement, id)

收件人:

row := db.QueryRow(sqlStatement)

答案 2 :(得分:-2)

您可以使用 fmt.Sprintf 在一行中非常干净地完成此操作。

...
    row := db.QueryRow(fmt.Sprintf("SELECT naam FROM medewerker WHERE naam='%s', id)
...