go语言 gin框架学习系列(六):gorm mysql 实现分页返回数据

353 阅读1分钟

1.实现分页返回数据

1.路由

// router.go
pmProject.GET("projectList", project.ProjectList) // TODO:项目列表
  1. controller
// controller.go
func ProjectList(c *gin.Context) {
    page, _ := strconv.Atoi(c.Query("page")) // c.Query 获取的参数是string格式 转换为int
    limit, _ := strconv.Atoi(c.Query("limit"))

    // 获取记录总数和列表信息
    projectModel := new(model.PmProjectModel)
    var pro []model.PmProject
    result, count := projectModel.GetProjectList(pro, page, limit)

    data := response.ListQryRspData{ // 响应数据 结构体
       List:  result,
       Count: int(count),
    }

    response.SuccessWithData(data, c)
}
  1. model.go
package model

import "gorm.io/gorm"

func (p *PmProjectModel) GetProjectList(pro []PmProject, page int, limit int) (list []PmProject, count int64) {
    // 分页查询
    res := db.Model(PmProject{}).Scopes(Pageinate(page, limit)).Find(&list)

    count = res.RowsAffected
    return
}

// 分页封装
func Pageinate(page int, pageSize int) func(db *gorm.DB) *gorm.DB {
    return func(db *gorm.DB) *gorm.DB {
       if page == 0 {
          page = 1
       }
       switch {
       case pageSize > 100:
          pageSize = 100
       case pageSize <= 0:
          pageSize = 10
       }

       offset := (page - 1) * pageSize
       return db.Offset(offset).Limit(pageSize)

    }
}

接口请求:

image.png

2.知识点

2.1 limit 与 offset 理解

limit指定要查询的最大记录数。(pagesize)。

Offset指定开始返回记录前要跳过的记录数。

db.Offset(offset).Limit(pageSize)

offset := (page - 1) * pageSize

举例:

例如:有100条数据 id从1开始
page=1 pageSize=10  返回结果 1-10  从第1条数据开始查,不跳过,所以offset=(page - 1) * pageSize=0

page=2 pageSize=10  返回结果 11-20  从第11条数据开始查,跳过1-10,所以offset=(page - 1) * pageSize=10

page=3 pageSize=10  返回结果 21-30  从第21条数据开始查,跳过1-20,所以offset=(page - 1) * pageSize=20

以此类推...

2.2 Scopes 理解

Scopes 允许重用常用逻辑,共享逻辑需要定义为类型 func(*gorm.DB) *gorm.DB

理解:分页函数返回类型为 func(db *gorm.DB) *gorm.DB,Scopes接受。