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