[Go] gorm 错误处理 与 链式/Finisher方法
使用 gorm 在调用 Finisher 方法之后,建议都进行错误检查。
Finishers 是会立即执行注册回调的方法,然后生成并执行 SQL,比如这些方法:
Create, First, Find, Take, Save, Update, Delete, Scan, Row, Rows…
完整方法列表 https://github.com/go-gorm/gorm/blob/master/finisher_api.go
链式方法是将 Clauses 修改或添加到当前 Statement 的方法,例如:
Where、Select、Omit、Joins、Scopes、Preload、Raw(但在构建 SQL 语句时,Raw 不能与其它链式方法一起使用)…
完整方法列表 https://github.com/go-gorm/gorm/blob/master/chainable_api.go
创建记录:
user := User{Name: "Jin", Age: 18, Birthday: time.Now()} result := db.Create(&user) // 通过数据的指针来创建 user.ID // 返回插入数据的主键 result.Error // 返回 error result.RowsAffected // 返回插入记录的条数
处理错误:
GORM 的错误处理与常见的 Go 代码不同,因为 GORM 提供的是链式 API。
如果遇到任何错误,GORM 会设置 *gorm.DB
的 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
错误。
如果发生了多个错误,你可以通过 errors.Is
判断错误是否为 ErrRecordNotFound,如:
// Check if returns RecordNotFound error err := db.First(&user, 100).Error errors.Is(err, gorm.ErrRecordNotFound)
Errors 错误
https://github.com/go-gorm/gorm/blob/master/errors.go