likes
comments
collection
share

[Golang-Gorm] Gorm的分页操作

作者站长头像
站长
· 阅读数 28

这是我参与8月更文挑战的第20天,活动详情查看:8月更文挑战

一、前言

在使用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格式数据)。

转载自:https://juejin.cn/post/6998499360627490846
评论
请登录