为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
有只小跳蛙 2023-05-08 15:14:39
我有这个返回错误的函数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 回答

?
繁星淼淼

TA贡献1775条经验 获得超11个赞

这是您编写此代码的方式。如果未返回任何内容,则返回的错误将是 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

}


查看完整回答
反对 回复 2023-05-08
  • 1 回答
  • 0 关注
  • 125 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信