2023-10-07 21:59:46
分页是查询的一个基本要求之一。这部分代码大多重复,适合复用。下面是一种最佳实践:
这是一个传有分页数据的Gin Handler,它需要对数据库进行分页查询:
func (p propertyRepository) GetPagedAndFiltered (limit, page int){
}
随后我们定义一个gorm
中间件去对数据库进行分页:
import "gorm.io/gorm"
type paginate struct {
int
limit int
page }
func newPaginate(limit int, page int) *paginate {
return &paginate{limit: limit,page: page}
}
func (p *paginate) paginatedResult(db *gorm.DB) *gorm.DB {
:= (p.page - 1) * p.limit
offset
return db.Offset(offset).
(p.limit)
Limit}
随后,就可以在数据库中使用分页了:
func (p propertyRepository) GetPagedAndFiltered(limit, page int) ([]Property, error) {
var properties []Property
:= p.db.Scopes(newPaginate(limit,page).paginatedResult).Find(&properties).Error
err
return properties, err
}
当然,我对上面的代码进行了进一步的集成。虽然损失了低耦合性质,但是只是在Gin使用的话体验拉满:
type Pagination struct {
int
PageSize int
PageNum }
// GetPagination Get pagination info
func GetPagination(c *gin.Context) Pagination {
var data Pagination
, _ := strconv.Atoi(c.Query("pagesize"))
pageSize, _ := strconv.Atoi(c.Query("pagenum"))
pageNumswitch {
case pageSize >= 100:
.PageSize = 100
datacase pageSize <= 0:
.PageSize = 10
data}
if pageNum <= 0 {
.PageNum = 1
data}
return data
}
func (p *Pagination) PaginatedResults(db *gorm.DB) *gorm.DB {
:= (p.PageNum - 1) * p.PageSize
offset return db.Offset(offset).Limit(p.PageSize)
}
使用方法就是在Gin
Handler中用GetPagination
获取分页参数,然后在model
的具体数据库实现操作中使用db.Scopes(page.PaginatedResult).xxx
直接分页。
应该是一种最佳实践。