如何从 MySQL 中确定错误类型

Posted

技术标签:

【中文标题】如何从 MySQL 中确定错误类型【英文标题】:How to determine the error type from MySQL 【发布时间】:2018-04-11 01:37:35 【问题描述】:

我真的很困惑如何通过 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

我可以打印 err 但它只是一个字符串,不喜欢偷看字符串以知道出了什么问题的想法,是否没有反馈来获取错误代码以执行 switch 或类似的事情?你是怎么做到的?

【问题讨论】:

【参考方案1】:

确实,检查错误字符串的内容是一种不好的做法,字符串值可能会因驱动程序版本而异。比较错误编号以确定具体错误是什么,这样会更好、更可靠。

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

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

还有错误variables

Ref

【讨论】:

你能解释一下第一行发生了什么吗?我从未见过这样的语法。它是从errormysql.MySQLError 的转换吗?或者这是一个函数调用..有点混乱。 这是一个错误类型转换,它只是一个如何获取错误并与外部包中的数字进行比较的示例。【参考方案2】:

通常在包中,如果包作者想要分隔错误,则可以看到变量,为每个错误创建变量,例如: 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

【讨论】:

更好的选择是打开错误,而不是连续的 If 语句:play.golang.org/p/-d_skg2tK-

以上是关于如何从 MySQL 中确定错误类型的主要内容,如果未能解决你的问题,请参考以下文章

如何确定 utf8 数据编码错误并在 MySql 中更正?

如何使用 jpa 在 mysql 中存储 java 对象?

如何确定 kotlin-multiplatform 项目中的构建类型

如何从错误消息中确定 PostgreSQL 错误代码

如何确定从 MySQL 导入的日期?

Mysql 函数确定性错误