有效的错误处理是 Go 语言中构建健壮应用程序的基石,尤其是在使用 GORM 与数据库交互时。GORM 的错误处理方法受其链式 API 的影响,需要对其有细致的理解。
基本错误处理
GORM 将错误处理集成到其链式方法语法中。 *gorm.DB
实例包含一个 Error
字段,当发生错误时会设置该字段。通常的做法是在执行数据库操作后,尤其是在 结束方法 之后检查此字段。
在一系列方法之后,检查 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
。
err := db.First(&user, 100).Error |
处理错误代码
许多数据库返回带有特定代码的错误,这些代码可以指示各种问题,例如约束违反、连接问题或语法错误。在 GORM 中处理这些错误代码需要解析数据库返回的错误并提取相关代码
- 示例:处理 MySQL 错误代码
import ( |
方言翻译错误
当启用 TranslateError
时,GORM 可以返回与正在使用的数据库方言相关的特定错误,GORM 会将特定于数据库的错误转换为其自己的通用错误。
db, err := gorm.Open(postgres.Open(postgresDSN), &gorm.Config{TranslateError: true}) |
- ErrDuplicatedKey
当插入操作违反唯一约束时会发生此错误
result := db.Create(&newRecord) |
- ErrForeignKeyViolated
当违反外键约束时会遇到此错误
result := db.Create(&newRecord) |
通过启用 TranslateError
,GORM 提供了一种更统一的方式来处理不同数据库中的错误,将特定于数据库的错误转换为常见的 GORM 错误类型。
错误
有关 GORM 可以返回的完整错误列表,请参阅 GORM 文档中的 错误列表。