gorm把没找到数据行也定义为Error,RecordNotFound感觉不太理解

Error应该是指一些底层的错误,查询未找到row(但执行还是成功的)不应该定义为error

这是它的文档:

Error Handling

After perform any operations, if there are any error happened, GORM will set it to *DB's Error field

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

// If there are more than one error happened, get all of them with `GetErrors`, it returns `[]error`
db.First(&user).Limit(10).Find(&users).GetErrors()

// Check if returns RecordNotFound error
db.Where("name = ?", "hello world").First(&user).RecordNotFound()

if db.Model(&user).Related(&credit_card).RecordNotFound() {
    // no credit card found handling
}
阅读 24.7k
4 个回答

其实没有什么对错的,你可以对这个err做多一步的处理,比如

db.Where("****").Find(&user).Error
if err == gorm.ErrRecordNotFound {
    // do something
}
if err != nil {
    // do something
}

可以这样处理,当找不到user的时候,报什么错,当数据库错误的时候报什么错,都可以自己定义,这样岂不是很好吗
其实这也是golang的一种惯用方法

这个实现是不合理的:
1.Gorm 是一个轻量的SQL wrapping。空记录是 DB 的正常返回,DB 层没产生过任何异常,因此 Gorm 也不应该返回 Error;
2.如果业务层认为空记录是 Error,那么在业务层应该根据返回的结果为 nil,产生业务级 Error,这是业务层的责任;
3.并且 Gorm 在查询需要返回 slice 时,即使空记录也不会产生 RecordNotFound Error,这和调用 first(&user) 这种返回 struct 的用法是相悖的。这个改成这样也是太多人反对“查不到数据就返回 RecordNotFound Error”,结果最后作者只改了 slice 的返回行为,而不改 struct,导致更奇怪

gorm作者和楼主理解错误的不同罢了,或者说作者理解的错误比楼主理解的错误范围更加广。

感觉楼主理解的错误就是系统异常,比如DB挂了,那么一个DB的查询操作就会返回这样一个的错误。gorm的ErrRecordNotFound也好理解,假设根据身份证号查询公民信息,如果是一个无效的身份证ID,那必然无法查询到结果,那这时候作为框架该如何表述这种情况呢?我能想到的,可以是返回一个error,或者返回nil。通过这样一个明确的信号,告诉调用方,通过这个身份证ID无法查询到公民信息。

设想另外一个常见的场景,对于用户输错了登录密码这类场景,那么登录处理函数的返回值中存在一个非nil的error,不知道楼主是否认可呢?

gorm 的查询结果赋值在业务层结构体指针上,如果不通过 error 的方式提示没查询到相应记录,用户只能通过结构体字段值来判断是否找到记录,如果作为结果接受者的结构体不包含主键/唯一字段,业务层判断是不那么准确的。

推荐问题
宣传栏