1

我正在使用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 中是否有处理数据库故障的常见模式?

4

1 回答 1

6

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

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

[原来的]

尝试根据gorm 自述文件“错误处理”部分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...
  }
}
于 2015-03-25T20:44:36.470 回答