如何在Go中正确绑定postgresql变量?

时间:2018-11-08 22:06:48

标签: postgresql go

我有此函数返回错误sql: Rows are closed。我不知道为什么...

这里是功能:

func GetUserFromToken(db *sql.DB, token string) User {
    query := `
        SELECT id, token, name, surname, phone, email FROM users WHERE token=$1
        `

    rows, err := db.Query(query, token)
    if err != nil {
        fmt.Println("query error : " + err.Error())
    }

    var user User
    rows.Next()
    err = rows.Scan(&user.ID, &user.Token, &user.Name, &user.Surname, &user.Phone, &user.Email)
    if err != nil {
        fmt.Println("scan error : " + err.Error())
    }

    return user
}

当我记录令牌时,它是正确的令牌。当我对查询中的令牌进行硬编码以进行测试时,它可以正常工作。例如:

query := `
        SELECT id, token, name, surname, phone, email FROM users WHERE token='abcdefg12345'
        `

还尝试设置查询,例如:

query := "SELECT id, token, name, surname, phone, email FROM users WHERE token = $1"

row := db.QueryRow(query, "abcdefg12345")

工作正常。 fmt.Println(token)打印abcdefg12345

有人可以帮助我了解我所缺少的吗?


更新:发现我失败了。

所以我拥有的令牌是使用以下功能从标头提取的承载令牌:

func GetBearerToken(r *http.Request) string {
    reqToken := r.Header.Get("Authorization")
    splitToken := strings.Split(reqToken, "Bearer")
    reqToken = splitToken[1]
    return reqToken
}

在fmt.Println中没有发现一个领先的空白。经过一整夜的睡眠,想着@RayfenWindspear的评论,我敦促检查字符串长度,然后我看到了失败。在我没有抓住它的同时,感觉有点白痴和逗乐。

所以我的简单解决方法是:  来自:reqToken = splitToken[1]  到:strings.TrimSpace(splitToken[1])

1 个答案:

答案 0 :(得分:2)

这是您编写此代码的方式。如果未返回任何内容,则返回的err将为sql.ErrNoRows。让我知道它是如何工作的,然后也许我可以给出其他调试步骤。

func GetUserFromToken(db *sql.DB, token string) (u User, err error) {
  err = db.QueryRow(
    "SELECT id, token, name, surname, phone, email FROM users WHERE token=$1",
    token,
  ).Scan(
    &u.ID,
    &u.Token,
    &u.Name,
    &u.Surname,
    &u.Phone,
    &u.Email)
  return
}