如何处理SQL请求中的错误

时间:2019-11-17 14:33:26

标签: go

我正在使用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 个答案:

答案 0 :(得分:1)

panic()退出程序。在您的示例中,return false从未达到。在这种情况下,您可以先log.Println(err),然后再return false。但老实说,在这样的go函数中,返回布尔和错误是一个好习惯。可以从数据库中返回错误,例如连接失败,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

答案 1 :(得分:0)

您针对sql.ErrNoRows https://golang.org/pkg/database/sql/#pkg-variables

测试了返回的错误值

我还建议评估客户端会话存储https://github.com/gorilla/sessions#sessions