go - 如何处理sql请求中的错误

标签 go

我正在使用 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/

相关文章:

go - "go get <package>"找不到包

winapi - 在 Windows 上将结构与 Golang 系统调用一起使用?

email - 如何在没有任何 smtp 服务器的情况下在 golang 中发送电子邮件

go - 我如何将类型存储在 go maps 中以供以后初始化

go - 将一片字符串转换为一片 float32

go - 同一台服务器上的多个 GO 项目

go - 对于给定的接口(interface),我有三个实现。三个实现如何共享相同的方法?

json - 构建结构以改变 API 提供的 json

google-app-engine - 将长字符串转换为 int64 - Go

go - 使用现有的 Homebrew 软件安装引导 Golang 安装的最佳方式