当前位置: 首页 > news >正文

gorm入门——如何实现分页查询

在 GORM 中,实现分页查询非常简单,你可以使用 LimitOffset 方法来控制查询结果的数量和起始位置。以下是如何实现分页查询的步骤:

分页查询的关键点

  • Limit(n): 设置返回的记录数量为 n
  • Offset(n): 设置查询的起始位置,跳过前 n 条记录。

示例代码

假设你有一个 User 结构体,并且希望实现分页查询。

package mainimport ("fmt""gorm.io/driver/mysql""gorm.io/gorm"
)type User struct {ID   uintName stringAge  int
}func main() {dsn := "user:password@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})if err != nil {panic(err)}var users []User// 假设我们要查询第2页,每页10条记录page := 2pageSize := 10// 计算 Offsetoffset := (page - 1) * pageSize// 执行分页查询db.Limit(pageSize).Offset(offset).Find(&users)fmt.Println("Paged users:", users)
}

解释:

  1. Limit(pageSize): 限制返回的记录数量为 pageSize。在本例中,每页显示 10 条记录。

  2. Offset(offset): 设置查询的起始位置,跳过前 offset 条记录。在本例中,offset 计算为 (page - 1) * pageSize,也就是跳过前 10 条记录,查询从第 11 条记录开始。

  3. Find(&users): 执行查询,并将结果保存到 users 切片中。

总记录数查询

通常,在分页查询时你还需要知道总记录数以计算总页数,可以通过以下方式获取总记录数:

var totalCount int64
db.Model(&User{}).Count(&totalCount)

结合分页查询,你可以计算总页数:

totalPages := int(math.Ceil(float64(totalCount) / float64(pageSize)))

综合示例:

将分页查询和总记录数查询结合起来:

package mainimport ("fmt""math""gorm.io/driver/mysql""gorm.io/gorm"
)type User struct {ID   uintName stringAge  int
}func main() {dsn := "user:password@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})if err != nil {panic(err)}var users []Uservar totalCount int64page := 2pageSize := 10offset := (page - 1) * pageSize// 获取总记录数db.Model(&User{}).Count(&totalCount)// 执行分页查询db.Limit(pageSize).Offset(offset).Find(&users)// 计算总页数totalPages := int(math.Ceil(float64(totalCount) / float64(pageSize)))fmt.Println("Paged users:", users)fmt.Println("Total pages:", totalPages)
}

这个示例实现了分页查询,并计算了总页数。通过 LimitOffset,你可以轻松实现各种分页需求。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • LVS(Linux virual server)详解
  • 密码学基础-为什么使用真随机数(True Random Number Generators)
  • 【Git】Git安装_配置
  • VisionPro二次开发学习笔记4-使用C#创建绘图图形
  • React(三):PDF文件在线预览(简易版)
  • Qt ts文件详解
  • 没有mac电脑ios上架截屏截图的最新方法
  • 如何在亚马逊云科技AWS上利用LoRA高效微调AI大模型减少预测偏差
  • C到C++——C++基础
  • 字段经常变,用什么数据库, mysql
  • 最新CSS3伪类和伪元素详解
  • CSS 多按钮根据半圆弧度排列
  • Vue - 关于v-wave 波浪动画组件
  • 【Dash】使用 dash_mantine_components 创建图表
  • 动态规划求解最小斯坦纳树(证了一天两夜)
  • 【108天】Java——《Head First Java》笔记(第1-4章)
  • ➹使用webpack配置多页面应用(MPA)
  • Apache的基本使用
  • Brief introduction of how to 'Call, Apply and Bind'
  • Git的一些常用操作
  • go append函数以及写入
  • JS正则表达式精简教程(JavaScript RegExp 对象)
  • Vue2.0 实现互斥
  • 后端_MYSQL
  • 漂亮刷新控件-iOS
  • 扑朔迷离的属性和特性【彻底弄清】
  • 深入浏览器事件循环的本质
  • 算法-插入排序
  • 在Unity中实现一个简单的消息管理器
  • 字符串匹配基础上
  • 资深实践篇 | 基于Kubernetes 1.61的Kubernetes Scheduler 调度详解 ...
  • # 数论-逆元
  • #NOIP 2014# day.1 T3 飞扬的小鸟 bird
  • #pragma multi_compile #pragma shader_feature
  • #我与Java虚拟机的故事#连载18:JAVA成长之路
  • (173)FPGA约束:单周期时序分析或默认时序分析
  • (22)C#传智:复习,多态虚方法抽象类接口,静态类,String与StringBuilder,集合泛型List与Dictionary,文件类,结构与类的区别
  • (7)摄像机和云台
  • (9)YOLO-Pose:使用对象关键点相似性损失增强多人姿态估计的增强版YOLO
  • (env: Windows,mp,1.06.2308310; lib: 3.2.4) uniapp微信小程序
  • (vue)页面文件上传获取:action地址
  • (附源码)计算机毕业设计SSM教师教学质量评价系统
  • (回溯) LeetCode 40. 组合总和II
  • (九)c52学习之旅-定时器
  • (七)c52学习之旅-中断
  • (一)插入排序
  • (转)Google的Objective-C编码规范
  • .desktop 桌面快捷_Linux桌面环境那么多,这几款优秀的任你选
  • .NET Entity FrameWork 总结 ,在项目中用处个人感觉不大。适合初级用用,不涉及到与数据库通信。
  • .Net Framework 4.x 程序到底运行在哪个 CLR 版本之上
  • .NET 除了用 Task 之外,如何自己写一个可以 await 的对象?
  • .NET 中 GetHashCode 的哈希值有多大概率会相同(哈希碰撞)
  • .NET开发者必备的11款免费工具
  • .NET企业级应用架构设计系列之结尾篇
  • :=