如何检测gorm中的连接故障?

时间:2015-03-25 18:06:03

标签: 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 代表连接,因此我甚至不得不担心重新连接或重新发出对{{1如果数据库连接失败?

  3. Go中是否存在处理数据库故障的常见模式?

1 个答案:

答案 0 :(得分:4)

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...
  }
}