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

问题描述 投票:0回答:2

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

由于数据库可能会独立于 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
2个回答
8
投票
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... } }
    

0
投票
主题发生9年后,现在我必须自己面对。

我的解决方案:

var goOrm *gorm.DB db, err := goOrm.DB() if err != nil { return nil } err = db.Ping() if err != nil { goOrm, err = connect() if err != nil { log.Println("cant reconnect") return nil } }
    
© www.soinside.com 2019 - 2024. All rights reserved.