gorm-cursor-paginator

A paginator doing cursor-based pagination based on GORM

Github stars Tracking Chart

gorm-cursor-paginator
Build Status
Coverage Status
Go Report Card
Codacy Badge

A paginator doing cursor-based pagination based on GORM

Installation

go get -u github.com/pilagod/gorm-cursor-paginator

Usage by Example

Assume there is an query struct for paging:

type PagingQuery struct {
    After  *string
    Before *string
    Limit  *int
    Order  *string
}

and a GORM model:

type Model struct {
    ID          int
    CreatedAt   time.Time
}

You can simply build up a new cursor paginator from the PagingQuery like:

import (
    paginator "github.com/pilagod/gorm-cursor-paginator"
)

func GetModelPaginator(q PagingQuery) *paginator.Paginator {
    p := paginator.New()

    p.SetKeys("CreatedAt", "ID") // [default: "ID"] (supporting multiple keys, order of keys matters)

    if q.After != nil {
        p.SetAfterCursor(*q.After) // [default: nil]
    }

    if q.Before != nil {
        p.SetBeforeCursor(*q.Before) // [default: nil]
    }

    if q.Limit != nil {
        p.SetLimit(*q.Limit) // [default: 10]
    }

    if q.Order != nil && *q.Order == "asc" {
        p.SetOrder(paginator.ASC) // [default: paginator.DESC]
    }
    return p
}

Then you can start to do pagination easily with GORM:

func Find(db *gorm.DB, q PagingQuery) ([]Model, paginator.Cursor, error) {
    var models []Model

    stmt := db.Where(/* ... other filters ... */)
    stmt = db.Or(/* ... more other filters ... */)

    // get paginator for Model
    p := GetModelPaginator(q)

    // use GORM-like syntax to do pagination
    result := p.Paginate(stmt, &models)

    if result.Error != nil {
        // ...
    }
    // get cursor for next iteration
    cursor := p.GetNextCursor()

    return models, cursor, nil
}

After paginating, you can call GetNextCursor(), which returns a Cursor struct containing cursor for next iteration:

type Cursor struct {
    After  *string `json:"after"`
    Before *string `json:"before"`
}

That's all ! Enjoy your paging in the GORM world :tada:

License

© Chun-Yan Ho (pilagod), 2018-NOW

Released under the MIT License

Main metrics

Overview
Name With Ownerpilagod/gorm-cursor-paginator
Primary LanguageGo
Program languageGo (Language Count: 2)
Platform
License:MIT License
所有者活动
Created At2018-10-09 10:09:20
Pushed At2025-05-23 07:39:46
Last Commit At2025-05-23 16:37:17
Release Count21
Last Release Namev2.7.0 (Posted on 2025-05-23 15:37:55)
First Release Namev0.1.0 (Posted on 2018-10-14 01:23:34)
用户参与
Stargazers Count204
Watchers Count5
Fork Count44
Commits Count194
Has Issues Enabled
Issues Count31
Issue Open Count1
Pull Requests Count38
Pull Requests Open Count1
Pull Requests Close Count1
项目设置
Has Wiki Enabled
Is Archived
Is Fork
Is Locked
Is Mirror
Is Private