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

如何处理sql请求中的错误

如何处理sql请求中的错误

Go
森林海 2023-08-07 10:58:54
我正在使用 Go 开发一个项目。我正在尝试通过查询 Postgres 数据库来验证用户的会话。当我得到匹配时,我想返回 true,当我没有匹配时,我想返回 false。问题是,当我没有匹配项时,我的程序会抛出错误。我还不确定如何在 Go 中捕获这些错误,或者是否有更智能的方法来运行查询。func confirmUser(userID string, session string) bool {    sqlStatement := `SELECT u.id FROM users u INNER JOIN user_sessions s ON u.id = s.userid WHERE u.id = $1 AND s.session = $2`    id := 0    err := db.QueryRow(sqlStatement, userID, session).Scan(&id)    if err != nil {        panic(err)        return false    }    fmt.Println("Found:", id)    return true}我的 db 变量是全局变量,因为我在很多地方使用它。我认为问题出在.Scan()电话上,但我不确定有更好的方法来解决这个问题。在 PHP 中,我将检查请求是否已成功发送,然后检查返回的行数。我还不知道如何在 Go 中做同样的事情。
查看完整描述

2 回答

?
皈依舞

TA贡献1851条经验 获得超3个赞

panic()退出程序。在你的例子中return false永远不会达到。在这种情况下,您可以log.Println(err)然后return false。但老实说,在像这样的 go 函数中,返回 bool 和 and 错误是很好的做法。连接失败、sql 错误、est 等错误可能会从数据库返回并需要处理。


func confirmUser(userID string, session string) (error, bool) {


    sqlStatement := `SELECT u.id FROM users u INNER JOIN user_sessions s ON u.id = s.userid WHERE u.id = $1 AND s.session = $2`

    id := 0

    err := db.QueryRow(sqlStatement, userID, session).Scan(&id)

    if err != nil {

        // if no rows there is no session

        if err == sql.ErrNoRows {

           return nil, false

        }

        // an error other than no rows was returned, return with error

        return err, false

    }

    fmt.Println("Found:", id)

    return nil, true

}

在你的函数上,confirmUser像这样调用你的函数


err, valid := confirmUser("myuserid", "sessionstring")

if err != nil {

    return err.Error()

}


if !valid (

    return "user not valid"

}


// user is valid go on


查看完整回答
反对 回复 2023-08-07
?
一只名叫tom的猫

TA贡献1906条经验 获得超3个赞

测试返回的错误值sql.ErrNoRows



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

添加回答

举报

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