全部学科
Python全栈
python
NodeJS全栈
nodejs
小程序首页
📅 2026-05-21 7 分钟 ✍️ juanwangdev

GORM 分页查询实现

GORM 通过 Limit 和 Offset 实现分页查询,本文介绍其核心用法。

什么是分页查询

分页查询将大量数据分批返回,避免一次性加载过多数据,提升性能和用户体验。

Limit 与 Offset

方法作用说明
Limit(n)限制返回条数每页大小
Offset(n)跳过前 n 条(页码-1) × 每页大小

基础分页

Go
type PaginateResult struct {
    Total int64       `json:"total"`
    Page  int         `json:"page"`
    Size  int         `json:"size"`
    Data  interface{} `json:"data"`
}

func Paginate(page, size int, result interface{}) PaginateResult {
    offset := (page - 1) * size
    
    // 查询总数
    var total int64
    db.Model(result).Count(&total)
    
    // 查询数据
    db.Offset(offset).Limit(size).Find(result)
    
    return PaginateResult{
        Total: total,
        Page:  page,
        Size:  size,
        Data:  result,
    }
}

分页使用示例

Go
// 查询第2页,每页10条
var users []User
page := 2
size := 10

db.Model(&User{}).
    Where("status = ?", "active").
    Count(&total).
    Offset((page - 1) * size).
    Limit(size).
    Order("created_at DESC").
    Find(&users)

带条件的分页查询

Go
func SearchUsers(name string, status string, page, size int) PaginateResult {
    query := db.Model(&User{})
    
    if name != "" {
        query = query.Where("name LIKE ?", "%"+name+"%")
    }
    if status != "" {
        query = query.Where("status = ?", status)
    }
    
    var total int64
    query.Count(&total)
    
    var users []User
    query.Offset((page - 1) * size).
        Limit(size).
        Order("created_at DESC").
        Find(&users)
    
    return PaginateResult{Total: total, Page: page, Size: size, Data: users}
}

Count 查询应在 Limit/Offset 之前执行,否则统计的是分页后的结果数。

注意事项

  • Offset 过大会导致全表扫描,深分页应使用游标或 ID 范围方式
  • Count 和 Find 应使用相同查询条件,确保总数与数据一致
  • 大表分页建议添加合适的索引,避免全表扫描
  • 前端页码从 1 开始,Offset 计算需减 1

要点总结

  • Limit 限制每页大小,Offset 跳过前 N 条
  • Offset 计算公式:(页码 - 1) × 每页大小
  • Count 查询在 Limit/Offset 之前执行
  • 深分页场景考虑使用游标分页优化性能

文章存放路径:D:\git2\jwdev\articles\GORM\进阶\高级查询技术\分页查询实现.md

📝 发现内容有误?点击此处直接编辑

← 上一篇 GORM 分组与聚合查询
下一篇 → GORM 原生 SQL 执行
想查看更多题目和详细解析?
小程序提供完整的题库、模拟考试和详细解析
马上就来

长按或扫描二维码,立即体验

扫码体验小程序
马上就来
使用微信扫描二维码
立即体验完整题库