[gogf/gf]gdb返回为空,需要判断sql.ErrNoRows【建议】

2024-06-25 687 views
7

gf版本v1.9.6

2019-09-27 16:35:32.471 [DEBU] [28 ms] SELECT t.id,t.user_id as userId,t.role_id as roleId FROM sys_user_role t WHERE  1 = 1  and user_id = 11 
2019-09-27 16:35:32.472 [ERRO] sys_user_role list error sql: no rows in result set 
Stack:
1.  gmanager/module/system.SysUserRole.List

当数据为空是,必须独立判断一下,代码如下

    err := model.dbModel("t").Fields(model.columns()).Where(where, params).OrderBy(form.OrderBy).Structs(&resData)
    if err == sql.ErrNoRows {
        return []SysUserRole{}
    } else if err != nil {
        glog.Error(model.TableName()+" list error", err)
        return []SysUserRole{}
    }

    return resData

个人建议:java没有数据直接返回空对象或者列表长度为0,不需要独立判断异常 而gdb正常查询每次还需要独立判断sql.ErrNoRows,感觉比较麻烦

回答

5

其实我理解有err就可以直接打印了~ 但是这个必须多加几行判断处理; 我觉得其实db层查询完就返回业务层 ,业务自己处理有没有数据就好了;即使db层多了这块处理,业务层还需要判断长度0没有数据的逻辑处理

1

@zcool321 这个错误是标准库 database/sql 中抛出的,使用其他如 gorm 这种框架也会出现同样的问题

9

我感觉当查询唯一数据时,如果没有,那么确实应该返回一个无数据的错误,而如果是查询多条数据的,没数据也不应该返回错,应该返回个空的列表

0

建议 没有数据也可以直接返回,而非单独再次做个判断,用过其他语言的orm,比如 django 查询没有数据直接返回空的queryset,单独再次判断查询结果有点麻烦

1

其实这个见智见仁吧,我记得以前gdb是不返回ErrNoRows的,我个人在项目中用起来反而觉得不方便。因为很多场景反而需要去额外判断,现在有ErrNoRows反而方便。如果不需要ErrNoRows的话其实可以自己封装一层,例如这样

func IgnoreErrNoRows(err error)(error){
    if err == sql.ErrNoRows{
        return nil
    }else{
        return err
    }
}
7

根据大家的反馈,计划下一个版本v1.10.0中将会在查询方法结果中移除掉sql. ErrNoRows的错误,但Struct/Structs/Scan方法的结果仍然保留。