跳到主要内容
版本:2.6.x

查询时避免返回对象初始化及 sql.ErrNoRows 判断

执行SQL查询时,请避免提前将查询结果初始化,以避免结构对象默认值的影响,避免创建不必要的对象内存。通过返回对象指针 nil 判断避免 sql.ErrNoRows 使用,降低代码对 error 处理的复杂度、统一项目中对空查询结果处理逻辑。

一个反面例子:

func (s *sTask) GetOne(ctx context.Context, id uint64) (out *entity.ResourceTask, err error) {
out = new(model.TaskDetail)
err = dao.ResourceTask.Ctx(ctx).WherePri(id).Scan(out)
if err != nil {
if err == sql.ErrNoRows {
err = gerror.Newf(`record not found for "%d"`, id)
}
return
}
return
}

在该例子中,实际返回的 out 对象由于对象初始化的缘故有了默认值(无论SQL是否查询到数据),并且 sql.ErrNoRows 的判断增加了代码逻辑中对 error 处理的复杂度。

建议改进如下:

func (s *sTask) GetOne(ctx context.Context, id uint64) (out *entity.ResourceTask, err error) {
err = dao.ResourceTask.Ctx(ctx).WherePri(id).Scan(&out)
if err != nil {
return
}
if out == nil {
err = gerror.Newf(`record not found for "%d"`, id)
}
return
}

注意代码中 &out 的使用。

更多的介绍请参考: ORM结果处理-为空判断