Golang GORM中RowsAffected使用报错,如何解决?
解决GORM中RowsAffected调用错误的问题
错误原因
你犯了两个关键问题:
- 错误地将
result赋值为GORM链式调用的.Error属性,导致result是error类型——而RowsAffected是GORM*DB实例的属性,error类型根本没有这个字段,因此报错。 - 函数返回值定义与实际想要返回的
RowsAffected类型不匹配:RowsAffected是int64类型,但你声明的返回值是(*models.ModelUser, error),这会导致额外的编译错误。
修正方案(根据实际需求二选一)
方案一:返回查询到的用户数量(RowsAffected)和错误
如果你的目标是获取模糊匹配的用户总数,调整函数返回值并修正代码:
func (r *repositoryUser) EntityResultAllTotal(search string) (int64, error) { cari := "%" + search + "%" var users []models.ModelUser // 保留GORM的*DB对象,不要直接取.Error db := r.db.Where("username LIKE ?", cari).Find(&users) if db.Error != nil { return 0, db.Error } return db.RowsAffected, nil }
注意:原代码用username = ?是错误的,模糊查询必须用LIKE才能匹配带%的通配符。
方案二:返回用户列表和错误(同时可获取行数)
如果你的目标是返回查询到的用户数据,调整返回值并按需使用RowsAffected:
func (r *repositoryUser) EntityResultAllTotal(search string) ([]models.ModelUser, error) { cari := "%" + search + "%" var users []models.ModelUser db := r.db.Where("username LIKE ?", cari).Find(&users) if db.Error != nil { return nil, db.Error } // 可在这里用db.RowsAffected做日志或其他逻辑 // fmt.Println("匹配到的用户数:", db.RowsAffected) return users, nil }
核心要点
GORM的链式调用(Where/Find等)返回的是*gorm.DB对象,这个对象同时包含RowsAffected(受影响行数)和Error(操作错误)属性——必须先保留整个*DB对象,再分别处理错误和获取行数,不能直接把.Error赋值给变量后再调用RowsAffected。
内容的提问来源于stack exchange,提问作者dev gomar
相关产品推荐
相关产品推荐

