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
📝 发现内容有误?点击此处直接编辑