GORM 错误类型识别
GORM 返回标准错误类型,使用 errors.Is 可准确判断错误类型,本文介绍常见 GORM 错误与处理方法。
GORM 错误常量
GORM 定义了一系列错误常量:
Go
import "gorm.io/gorm"
// 常见错误
gorm.ErrRecordNotFound // 记录未找到
gorm.ErrInvalidTransaction // 无效事务
gorm.ErrDryRunModeUnsupported // 不支持 DryRun
gorm.ErrMissingWhereClause // 缺少 WHERE 条件
gorm.ErrUnsupportedRelation // 不支持的关联关系
错误类型识别
使用 errors.Is 判断错误类型:
Go
import (
"errors"
"gorm.io/gorm"
)
var user User
err := db.First(&user, 1).Error
if errors.Is(err, gorm.ErrRecordNotFound) {
fmt.Println("记录未找到")
} else if err != nil {
fmt.Printf("其他错误: %v\n", err)
}
常见使用场景
Go
// 场景1: 查询记录
err := db.Where("email = ?", email).First(&user).Error
if errors.Is(err, gorm.ErrRecordNotFound) {
return nil, fmt.Errorf("用户不存在")
}
// 场景2: 更新记录
err := db.Model(&User{}).Where("id = ?", id).Update("name", name).Error
if errors.Is(err, gorm.ErrMissingWhereClause) {
return fmt.Errorf("缺少 WHERE 条件")
}
错误处理对照
| 错误类型 | 触发场景 | 处理建议 |
|---|---|---|
ErrRecordNotFound | First/Take/Last 未找到记录 | 返回 404 或创建新记录 |
ErrInvalidTransaction | 事务未开始或已提交 | 检查事务状态 |
ErrMissingWhereClause | Delete/Update 缺少 WHERE | 补充条件或使用 Unscoped |
ErrCheckConstraintViolated | 约束检查失败 | 检查数据完整性 |
不要使用字符串匹配判断错误,始终使用
errors.Is。
要点总结
- GORM 定义标准错误常量如
ErrRecordNotFound - 使用
errors.Is(err, gorm.ErrXxx)判断错误类型 - 不要字符串匹配,使用标准库 errors.Is
- 根据错误类型采取不同处理策略
文章存放路径:D:\git2\jwdev\articles\GORM\进阶\错误处理与日志\错误类型识别.md
📝 发现内容有误?点击此处直接编辑