教程
错误处理
登录后可跨设备保存划线和私人笔记登录
有效的错误处理是 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 文档中的错误列表。
评论
登录后参与评论
正在加载评论…
KnowForge