【导读】作者介绍了使用 gorm 实现的后端分页
一、前言
在使用Go语言进行后端开发时,个人比较喜欢的一个orm是Gorm,也是Go后端开发中使用最多的orm(star最多)。而且它还是由国内大佬jinzhu开发的,看着格外顺眼。
和python的SQLAlchemy相比,gorm没有专门用于分页的函数(应该大部分orm都没有吧),由于本人是从python后端转到go后端,少了一些语法糖有些不适应,在这里记录并分享一下使用gorm实现web后端开发中常用到的分页操作。
二、绑定参数
为方便介绍,这里使用Gin作为Web开发框架接收前端传来的参数。
首先需要构建一个接收参数的结构体:
type Page struct {
PageNum int `form:"page_num"`
PageSize int `form:"page_size"`
Keyword string `form:"keyword"`
Desc bool `form:"desc"`
}
主要需要用到的两个参数是页码数量page_num以及分页大小page_size。
这里留下了另外两个参数,其中keyword是作为关键字进行可能存在的模糊搜索操作,而desc表示是否反向搜索(比如需要寻找较早数据时)。
使用Gin的ShouldBindQuery绑定参数:
var p Page
if c.ShouldBindQuery(&p) != nil {
c.JSON(http.StatusUnauthorized, gin.H{
"err_msg": "参数错误",
})
return
}
if p.PageNum <= 0 {
p.PageNum = 1
}
三、分页查询
if err := DB.Limit(p.pageSize).Offset((p.PageNum-1)*p.pageSize).Find(&users).Error; err != nil {
c.JSON(http.StatusUnauthorized, gin.H{
"err_msg": err.Error(),
})
}
上面是分页操作的代码代码实现,其中:
Limit表示返回的数据数量,即分页大小page_size。
Offset表示按顺序跳过的数量,为达到分页的效果,需要跳过的数量为(page_num - 1) * page_size。
此外,如果有转置顺序的操作,需加上(要if判断desc是否为true):
.Order("created_at desc") // 按创建时间反向
另外,模糊搜素需要加上:
.Where(" name LIKE % ? % ",keyword) // 按名字模糊搜索
四、计算总页数
var total int
DB.Model(&User{}).Count(&total)
pageNum := total / pageSize
if total % pageSize != 0{
pageNum++
}
计算总页数,首先要获得总数据数,使用Count进行获取。Count只用于统计数量,并不返回数据本身,因此不必担心资源的占用和消耗。
使用总数整除分页大小,并向上取整,就可以得到分页数量。
五、返回参考
c.JSON(200, gin.H{
"code": 200,
"msg": "查询成功"
"data": serializer.BuildUsers(users),
"total": total,
"page_num": pageNum,
})
这里返回了页面数量和数据总数,方便前端生成页面。
本页的数据使用array的形式存在data字段中(serializer用于生成序列化json格式数据)。
转自:
juejin.cn/post/6998499360627490846
- EOF -
Go 开发大全
参与维护一个非常全面的Go开源技术资源库。日常分享 Go, 云原生、k8s、Docker和微服务方面的技术文章和行业动态。
关注后获取
回复 Go 获取6万star的Go资源库
分享、点赞和在看
支持我们分享更多好文章,谢谢!
文章评论