Go 後端分頁怎麼做?用 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 格式數據)。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/EVwu09HEPuHifaV8WzK_kA