错误处理

有效的错误处理是 Go 语言中构建健壮应用程序的基石,尤其是在使用 GORM 与数据库交互时。GORM 的错误处理方法受其链式 API 的影响,需要对其有细致的理解。

基本错误处理

GORM 将错误处理集成到其链式方法语法中。 *gorm.DB 实例包含一个 Error 字段,当发生错误时会设置该字段。通常的做法是在执行数据库操作后,尤其是在 结束方法 之后检查此字段。

在一系列方法之后,检查 Error 字段至关重要

if err := db.Where("name = ?", "jinzhu").First(&user).Error; err != nil {
// Handle error...
}

或者

if result := db.Where("name = ?", "jinzhu").First(&user); result.Error != nil {
// Handle error...
}

ErrRecordNotFound

当使用 FirstLastTake 等方法找不到记录时,GORM 会返回 ErrRecordNotFound

err := db.First(&user, 100).Error
if errors.Is(err, gorm.ErrRecordNotFound) {
// Handle record not found error...
}

处理错误代码

许多数据库返回带有特定代码的错误,这些代码可以指示各种问题,例如约束违反、连接问题或语法错误。在 GORM 中处理这些错误代码需要解析数据库返回的错误并提取相关代码

  • 示例:处理 MySQL 错误代码
import (
"github.com/go-sql-driver/mysql"
"gorm.io/gorm"
)

// ...

result := db.Create(&newRecord)
if result.Error != nil {
if mysqlErr, ok := result.Error.(*mysql.MySQLError); ok {
switch mysqlErr.Number {
case 1062: // MySQL code for duplicate entry
// Handle duplicate entry
// Add cases for other specific error codes
default:
// Handle other errors
}
} else {
// Handle non-MySQL errors or unknown errors
}
}

方言翻译错误

当启用 TranslateError 时,GORM 可以返回与正在使用的数据库方言相关的特定错误,GORM 会将特定于数据库的错误转换为其自己的通用错误。

db, err := gorm.Open(postgres.Open(postgresDSN), &gorm.Config{TranslateError: true})
  • ErrDuplicatedKey

当插入操作违反唯一约束时会发生此错误

result := db.Create(&newRecord)
if errors.Is(result.Error, gorm.ErrDuplicatedKey) {
// Handle duplicated key error...
}
  • ErrForeignKeyViolated

当违反外键约束时会遇到此错误

result := db.Create(&newRecord)
if errors.Is(result.Error, gorm.ErrForeignKeyViolated) {
// Handle foreign key violation error...
}

通过启用 TranslateError,GORM 提供了一种更统一的方式来处理不同数据库中的错误,将特定于数据库的错误转换为常见的 GORM 错误类型。

错误

有关 GORM 可以返回的完整错误列表,请参阅 GORM 文档中的 错误列表

铂金赞助商

黄金赞助商

铂金赞助商

黄金赞助商