如何在golang中获取mySQL错误类型?

时间:2017-10-30 06:15:54

标签: mysql go error-handling

我真的很困惑如何使用mySQL导入从失败的查询行中获取错误类型。没有真正的文档,所以它让我真的很困惑。

目前我有:

result, err := db.Exec("INSERT INTO users (username,password,email) VALUES (?,?,?)", username, hashedPassword, email)
if err != nil {
    // handle different types of errors here
    return
}

我可以打印错误,但它只是一个字符串,不喜欢偷看字符串以了解出错的想法,是否没有反馈来获取错误代码来执行switch或沿着这些行?你是怎么做到的?

2 个答案:

答案 0 :(得分:6)

实际上,检查错误字符串的内容是一种不好的做法,字符串值可能会因驱动程序verison而异。比较错误数以识别特定错误是更好和更健壮的。

mysql 驱动程序有错误代码,package与主驱动程序包分开维护。但是,执行此操作的机制因驱动程序而异,因为这不是数据库/ sql本身的一部分。使用该包,您可以检查错误类型MySQLError

if driverErr, ok := err.(*mysql.MySQLError); ok {
    if driverErr.Number == mysqlerr.ER_ACCESS_DENIED_ERROR {
        // Handle the permission-denied error
    }
}

还有错误variables

<子> Ref

答案 1 :(得分:1)

通常在包中你可以看到变量,如果包作者想要分开错误,为每个包创建变量,如: https://golang.org/pkg/database/sql/#pkg-variables

你可以看到错误,你可以在返回时切换错误,并为每个错误变量添加一个错误。

示例:

result, err := db.Exec("INSERT INTO users (username,password,email) VALUES (?,?,?)", username, hashedPassword, email)
if err == sql.ErrNoRows {
    // handle error
    return
}
if err == sql.ErrTxDone {
    // handle error
    return
}