如何检测 gorm 中的连接失败?
How can I detect a connection failure in gorm?
我正在使用 gorm ORM.
编写一个简单的小型 Web 应用程序
由于数据库可能独立于 Web 应用程序而失败,我希望能够识别与这种情况对应的错误,以便我可以重新连接到我的数据库而无需重新启动 Web 应用程序。
励志例子:
考虑以下代码:
var mrs MyRowStruct
db := myDB.Model(MyRowStruct{}).Where("column_name = ?", value).First(&mrs)
return &mrs, db.Error
如果 db.Error != nil
,我如何以编程方式确定错误是否源于数据库连接问题?
根据我的阅读,我了解到 gorm.DB
不代表 连接,所以我什至不必担心重新连接或重新连接如果数据库连接失败,发出对 gorm.Open
的调用?
在 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...
}
}
我正在使用 gorm ORM.
编写一个简单的小型 Web 应用程序由于数据库可能独立于 Web 应用程序而失败,我希望能够识别与这种情况对应的错误,以便我可以重新连接到我的数据库而无需重新启动 Web 应用程序。
励志例子:
考虑以下代码:
var mrs MyRowStruct
db := myDB.Model(MyRowStruct{}).Where("column_name = ?", value).First(&mrs)
return &mrs, db.Error
如果
db.Error != nil
,我如何以编程方式确定错误是否源于数据库连接问题?根据我的阅读,我了解到
gorm.DB
不代表 连接,所以我什至不必担心重新连接或重新连接如果数据库连接失败,发出对gorm.Open
的调用?在 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...
}
}