成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

如何優雅的使用 GORM 進行分頁?

開發 后端
雖然 GORM 提供了關于如何使用scopes 進行分頁的文檔,但在靈活性和可用性方面仍有改進的空間。在這里,我將介紹一種使用 GORM 的 Clauses 進行分頁的替代方法。

GORM 是 Go 中使用最廣泛的 ORM 包,但盡管如此,它缺少一些“基本”功能。其中一個缺失的功能就是分頁(Pagination)。

分頁是管理應用程序中大型數據集的一個重要功能。它是一種限制和顯示數據庫中部分總數據的方法,這樣就不需要一次性檢索整個表,這樣可以極大的提高接口性能,降低超時失敗的概率。

雖然 GORM 提供了關于如何使用scopes 進行分頁的文檔,但在靈活性和可用性方面仍有改進的空間。在這里,我將介紹一種使用 GORM 的 Clauses 進行分頁的替代方法。

使用 Scopes 的分頁

GORM 的官網文檔介紹了使用 Scopes 進行分頁的代碼示例:

func Paginate(page, pageSize int) func(db *gorm.DB) *gorm.DB {
    return func (db *gorm.DB) *gorm.DB {
        // validate page and pageSize
        ...
        offset := (page - 1) * pageSize
        return db.Offset(offset).Limit(pageSize)
    }
}

page := 0
pageSize := 10
db.Scopes(Paginate(page, pageSize)).Find(&users)

因此,為了使用分頁功能,我們需要使用以下代碼 db.Scopes(Paginate(page, pageSize))…

使用 Clauses 的分頁

一種不同且可以說更優雅的方法是使用 GORM Clauses,這種方法與使用 scope 略有不同,因為 Clauses 負責修改數據庫查詢,特別是 WHERE 子句。

讓我們先定義分頁結構體:

type Pagination struct {
    page          int
    pageSize      int
}

func (p *Pagination) GetPage() int {
    return p.page
}
func (p *Pagination) GetPageSize() int {
    return p.pageSize
}

然后,讓我們實現兩個接口,以便在 Gorm Clauses 函數中使用這個結構體:

clause.Expression
gorm.StatementModifier

所以結構看起來是這樣的:

func (p *Pagination) ModifyStatement(stm *gorm.Statement) {
    // We modify statement to add the pagination
    db := stm.DB
    stm.DB.Limit(p.size).Offset((p.page - 1) * p.pageSize)
}

func (p *Pagination) Build(_ clause.Builder) {
    // The Build method is left empty since pagination does not require any additional SQL clauses.
}

之后,可以按照以下方式使用分頁:

pagination := Pagination{
    page: 0,
    pageSize: 10,
}
db.Clauses(&pagination).Find(&users)

為了使這種方法可重用并增強其功能,這里介紹一個小眾的包 PaGorminator[4]:一個利用此功能進行分頁的庫,同時添加了其他功能,如無分頁請求和自動填充元數據,如總頁數和總計數。

使用方法如下:

// Add plugin
_ = db.Use(pagorminator.PaGormMinator{})
...
pageRequest, _ := pagorminator.PageRequest(0, 10)
db.Clauses(pageRequest).Find(&users)
// this will apply pagination, and also populate pageRequest with:
// - the total number of pages
// - total count
責任編輯:趙寧寧 來源: 令飛編程
相關推薦

2023-11-06 12:00:04

GORM

2023-11-04 15:46:03

GORMGo

2024-12-02 09:57:43

GormScopesClauses

2019-01-21 09:28:32

版本命令程序員

2020-08-29 19:28:08

版本回退命令代碼

2015-11-26 10:53:45

LinuxWindowsMac OS

2017-07-26 11:32:50

NETRabbitMQ系統集成

2023-11-08 15:04:55

事務GORM

2023-11-10 00:05:50

GORM分頁排序

2023-03-28 08:07:12

2023-06-16 09:08:39

ReactContextRFC

2020-11-05 18:30:32

接口測試

2022-09-15 07:31:49

Spring攔截器注解

2024-12-06 09:27:28

2021-03-28 09:17:18

JVM場景鉤子函數

2022-09-14 08:16:48

裝飾器模式對象

2021-12-27 09:50:03

JavaScript開發數據分組

2022-09-07 09:19:49

Docker健康檢查

2023-11-17 12:04:39

GORM并發

2022-06-02 10:02:47

Kubectl更新應用Linux
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 精品国产18久久久久久二百 | 日韩一二区 | 性福视频在线观看 | 婷婷激情综合 | 天天操天天摸天天干 | 一级在线毛片 | 日韩黄a | 红色av社区 | 一区二区免费 | 久久午夜电影 | 欧美人成在线视频 | 日日骑| 麻豆av网| 国产精品欧美一区二区三区 | 国产天天操 | 亚洲综合一区二区三区 | 日韩欧美一区二区三区 | 色久五月 | 午夜视频一区 | 在线观看中文字幕 | 香蕉av免费| 亚洲一区播放 | 欧美jizzhd精品欧美巨大免费 | 欧美久| 亚洲一区二区三区久久 | 国产网站在线播放 | 婷婷综合久久 | 国产精品美女久久久久久久网站 | 一级毛片大全免费播放 | 羞羞的视频免费在线观看 | 日日干干 | 久久久91精品国产一区二区三区 | 亚洲成av人片在线观看 | 成人av一区二区三区 | 涩涩片影院 | 国产成人艳妇aa视频在线 | 国产精品久久欧美久久一区 | 久久亚洲国产精品 | 成人在线中文字幕 | 色综合一区 | 色天天综合 |