Go 后端分页怎么做?用 Gorm!

2022年4月26日 273点热度 0人点赞 0条评论

【导读】作者介绍了使用 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 -

推荐阅读(点击标题可打开)

1、Golang 负载均衡算法

2、Golang panic和recover 实现原理

3、Golang 分布式系统

Go 开发大全

参与维护一个非常全面的Go开源技术资源库。日常分享 Go, 云原生、k8s、Docker和微服务方面的技术文章和行业动态。

图片

关注后获取

回复 Go 获取6万star的Go资源库

分享、点赞和在看

支持我们分享更多好文章,谢谢!

13560Go 后端分页怎么做?用 Gorm!

root

这个人很懒,什么都没留下

文章评论