我正在使用 Go 开发一个项目。
我正在尝试通过查询 Postgres 数据库来验证用户的 session 。当我得到匹配时,我想返回 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 中做同样的事情。
最佳答案
panic()
退出程序。在您的示例中 return false
永远达不到。在这种情况下,您可以 log.Println(err)
然后 return false
.但老实说,在这样的 go 函数中,返回 bool 和错误是一种很好的做法。连接失败、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
关于go - 如何处理sql请求中的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58901523/