查询时避免返回对象初始化及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结果处理-为空判断
4 Comments
小陈
终于刷完了orm章节
krlin
刷 3 遍了
changwj
粗略过了一遍
krlin
我是前端同学,有人知道 mysql 如何通过这套 orm 来实现分库分表吗