[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.DBError 字段。

您需要像这样检查它:

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

或者 

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

ErrRecordNotFound 错误

FirstLastTake 方法找不到记录时,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

Link:https://www.cnblogs.com/farwish/p/14225964.html