error-handling - 如何检测 gorm 中的连接失败?

标签 error-handling go go-gorm

我正在使用 gorm ORM 编写一个小型、简单的网络应用程序.

由于数据库可能独立于 Web 应用程序而失败,我希望能够识别与这种情况对应的错误,以便我可以重新连接到我的数据库而无需重新启动 Web 应用程序。

激励示例:

考虑以下代码:

var mrs MyRowStruct
db := myDB.Model(MyRowStruct{}).Where("column_name = ?", value).First(&mrs)
return &mrs, db.Error
  1. 如果 db.Error != nil,我如何以编程方式确定错误是否源于数据库连接问题?

  2. 根据我的阅读,我了解到 gorm.DB 代表一个连接,所以我什至不必担心重新连接或重新发出一个如果数据库连接失败,是否调用 gorm.Open

  3. 在 Go 中是否有处理数据库故障的通用模式?

最佳答案

Gorm 似乎吞下了数据库驱动程序错误并仅发出它自己的错误类型分类(参见 gorm/errors.go)。目前似乎没有报告连接错误。

考虑提交问题或拉取请求以直接公开数据库驱动程序错误。

[原创]

尝试根据 gorm readme "Error Handling" section 中的建议检查 db.Error 的运行时类型.

假设它是您的数据库驱动程序返回的错误类型,您可能会得到指示连接错误的特定代码。例如,如果您通过 pq 库使用 PostgreSQL,那么您可以尝试这样的操作:

import "github.com/lib/pq"

// ...

if db.Error != nil {
  pqerr, ok := err.(*pq.Error)
  if ok && pqerr.Code[0:2] == "08" {
    // PostgreSQL "Connection Exceptions" are class "08"
    // http://www.postgresql.org/docs/9.4/static/errcodes-appendix.html#ERRCODES-TABLE
    // Do something for connection errors...
  } else {
    // Do something else with non-pg error or non-connection error...
  }
}

关于error-handling - 如何检测 gorm 中的连接失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29263203/

相关文章:

Java Swing : Making a Combo Box error message

python - 我的代码另一个错误

templates - 如何使用特定键访问该结构映射中的结构字段值

GORM 不忽略 `gorm:"-"` 字段

mysql - time.Time 的子类型不使用 gorm lib 创建列

java - Java libGdx : FreeTypeFontGenerator is not working (Black screen)

iphone - 我需要释放返回的 NSError 对象吗?

go - Char '0' 不等于 int 0?

json - Golang - 使用更改键值解码 JSON

json - json 编码时间中可变的亚秒数