【问题标题】:How can I detect a connection failure in gorm?如何检测gorm中的连接失败?
【发布时间】:2015-03-25 18:06:02
【问题描述】:

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

【问题讨论】:

    标签: error-handling go go-gorm


    【解决方案1】:

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

    【讨论】:

    • 非常感谢!你的 sn-p 完美地回答了我的问题。
    猜你喜欢
    • 2015-06-19
    • 1970-01-01
    • 2021-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-18
    • 2015-09-10
    • 2011-06-13
    相关资源
    最近更新 更多