猿问

如何处理sql请求中的错误

我正在使用 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 中做同样的事情。


森林海
浏览 136回答 2
2回答

皈依舞

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

一只名叫tom的猫

测试返回的错误值sql.ErrNoRows
随时随地看视频慕课网APP

相关分类

Go
我要回答