教程

错误处理

qianmoQqianmoQ· 更新于 2026-09-23· 阅读 7 分钟· 0 次阅读

登录后可跨设备保存划线和私人笔记登录

有效的错误处理是 Go 中健壮应用开发的基石,尤其是在使用 GORM 与数据库交互时。GORM 的错误处理方式需要根据你所使用的 API 风格进行细致的理解。

基本错误处理

泛型 API

使用泛型 API 时,错误会从操作方法中直接返回,遵循 Go 的标准错误处理模式:

ctx := context.Background()


user, err := gorm.G[User](db).Where("name = ?", "jinzhu").First(ctx)
if err != nil {
  
}


err := gorm.G[User](db).Where("id = ?", 1).Delete(ctx)
if err != nil {
  
}

传统 API

使用传统 API 时,GORM 将错误处理集成到其链式方法语法中。*gorm.DB 实例包含一个 Error 字段,在发生错误时会被设置。常见的做法是在执行数据库操作之后检查该字段,尤其是在终结方法(Finisher Methods)之后。

在执行完一串方法之后,检查 Error 字段至关重要:

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

或者另一种写法:

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

ErrRecordNotFound

当使用 First、Last、Take 等方法未找到记录时,GORM 会返回 ErrRecordNotFound。

泛型 API

ctx := context.Background()

user, err := gorm.G[User](db).First(ctx)
if errors.Is(err, gorm.ErrRecordNotFound) {
  
}

传统 API

err := db.First(&user, 100).Error
if errors.Is(err, gorm.ErrRecordNotFound) {
  
}

处理错误代码

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

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: 
            
        
        default:
            
        }
    } else {
        
    }
}

方言翻译错误

当启用 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) {
    
}
  • ErrForeignKeyViolated

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

result := db.Create(&newRecord)
if errors.Is(result.Error, gorm.ErrForeignKeyViolated) {
    
}

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

错误

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

GitHub tag (latest SemVer)

评论

登录后参与评论

正在加载评论…