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

Golang GORM系列:GORM分页和排序

高效的数据检索和表示是应用程序开发的关键方面。GORM是健壮的Go对象关系映射库,它为开发人员提供了强大的工具来实现这一点。无论你是在构建动态web应用程序还是数据密集型服务,掌握GORM中的分页和排序使您能够提供无缝且高效的用户体验。本文我们将深入研究GORM中的分页和排序。到最后,你将熟练地实现这些功能,以简化数据表示并增强Go项目中的用户体验。

在这里插入图片描述

GORM实现分页

分页使您能够在可管理的块中检索和呈现数据,从而提高性能和可用性。

第一步:Limit 和 Offset

使用GORM的‘ Limit ’和‘ Offset ’方法来实现分页:

var products []Product
db.Limit(10).Offset(20).Find(&products)

步骤2:用页码进行分页

使用页码和每页固定数量的记录实现分页:

pageNumber := 2
pageSize := 10
var products []Product
db.Limit(pageSize).Offset((pageNumber - 1) * pageSize).Find(&products)

GORM查询结果排序

根据特定的标准对查询结果进行排序,增强了数据的表示和可用性。

步骤1:对查询结果进行排序

使用GORM的‘ Order ’方法对查询结果进行排序:

var sortedProducts []Product
db.Order("price desc").Find(&sortedProducts)

示例:使用GORM按多列排序

要按多列对查询结果排序,请在‘ Order ’方法中使用逗号分隔的列表:

var products []Product
db.Order("category asc, price desc").Find(&products)

完整示例

假设我们有一个电商平台,其中有一个商品表 products,表结构如下:

CREATE TABLE products (id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(255) NOT NULL,price DECIMAL(10, 2) NOT NULL,created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

我们需要实现一个功能:查询所有商品,并按照价格从高到低排序,同时支持分页。

GORM 实现分页和排序

定义模型

首先,我们需要定义一个与 products 表对应的 GORM 模型:

type Product struct {ID        uint      `gorm:"primaryKey"`Name      string    `gorm:"size:255;not null"`Price     float64   `gorm:"type:decimal(10,2);not null"`CreatedAt time.Time `gorm:"default:CURRENT_TIMESTAMP"`
}
分页和排序查询

接下来,我们实现一个函数来查询商品列表,并支持分页和排序:

package mainimport ("fmt""gorm.io/driver/mysql""gorm.io/gorm""time"
)type Product struct {ID        uint      `gorm:"primaryKey"`Name      string    `gorm:"size:255;not null"`Price     float64   `gorm:"type:decimal(10,2);not null"`CreatedAt time.Time `gorm:"default:CURRENT_TIMESTAMP"`
}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("failed to connect database")}// 自动迁移 schemadb.AutoMigrate(&Product{})// 查询商品列表,支持分页和排序page := 1pageSize := 10var products []Productresult := db.Order("price desc").Offset((page - 1) * pageSize).Limit(pageSize).Find(&products)if result.Error != nil {panic(result.Error)}// 输出查询结果for _, product := range products {fmt.Printf("ID: %d, Name: %s, Price: %.2f, CreatedAt: %s\n", product.ID, product.Name, product.Price, product.CreatedAt)}
}
代码解释
  1. 连接数据库:使用 gorm.Open 连接 MySQL 数据库。
  2. 自动迁移db.AutoMigrate(&Product{}) 会自动创建或更新表结构。
  3. 分页和排序查询
    • Order("price desc"):按照 price 字段降序排列。
    • Offset((page - 1) * pageSize):计算偏移量,跳过前面的记录。
    • Limit(pageSize):限制每页的记录数。
    • Find(&products):执行查询并将结果存储到 products 切片中。
  4. 输出结果:遍历 products 切片并输出每个商品的信息。

分页和排序的扩展

在实际项目中,分页和排序的需求可能会更加复杂。例如:

  • 多字段排序:可以按照多个字段进行排序,例如先按价格排序,再按创建时间排序:

    db.Order("price desc, created_at asc").Offset((page - 1) * pageSize).Limit(pageSize).Find(&products)
    
  • 动态分页和排序:可以根据用户输入的参数动态调整分页和排序条件:

    func GetProducts(db *gorm.DB, page, pageSize int, sortField, sortOrder string) ([]Product, error) {var products []Productquery := db.Model(&Product{})if sortField != "" {order := fmt.Sprintf("%s %s", sortField, sortOrder)query = query.Order(order)}result := query.Offset((page - 1) * pageSize).Limit(pageSize).Find(&products)return products, result.Error
    }
    

通过 GORM,我们可以非常方便地实现分页和排序功能。在实际项目中,分页和排序是非常常见的需求,掌握这些技巧可以大大提高开发效率。希望这个示例对你有所帮助!

最后总结

在应用程序中,分页和排序是有效表示数据的基本技术。GORM的内置分页和排序方法为你提供了管理大型数据集和根据用户需求定制其表示的工具。当你应用本指南中的示例时,请记住GORM的分页和排序功能旨在增强用户体验并优化Go项目中的数据交互。

相关文章:

Golang GORM系列:GORM分页和排序

高效的数据检索和表示是应用程序开发的关键方面。GORM是健壮的Go对象关系映射库,它为开发人员提供了强大的工具来实现这一点。无论你是在构建动态web应用程序还是数据密集型服务,掌握GORM中的分页和排序使您能够提供无缝且高效的用户体验。本文我们将深入…...

【怎么使用Redis实现一个延时队列?】

怎么使用Redis实现一个延时队列? 详细说明Java代码示例解释注意事项使用Redis实现延时队列通常通过有序集合(Sorted Set)来实现,利用Redis的ZSET类型及其相关命令可以很方便地实现这一功能。 有序集合中的每个元素都有一个分数(score),我们可以利用这个分数来存储消息需…...

HarmonyNext上传用户相册图片到服务器

图片选择就不用说了,直接用 无须申请权限 。 上传图片,步骤和android对比稍微有点复杂,可能是为了安全性考虑,需要将图片先拷贝到缓存目录下面,然后再上传,当然你也可以转成Base64,然后和服务…...

宝塔docker 安装oracle11G

1、拉取镜像 sudo docker pull iatebes/oracle_11g #iatebes为用户名2、查看镜像 sudo docker images3、创建并运行容器 docker run -d --privileged --name oralce11g -p 1521:1521 iatebes/oracle_11g4、登录到容器 5、进入容器并修改system用户密码 docker exec -it orac…...

计算机视觉-OpenCV图像处理

1.Matplotlib数据可视化(绘制图像直方图、可视化矩阵) # Matplotlib 数据可视化(绘制图像直方图、可视化矩阵) # 本节主要讲解如何使用 Matplotlib 绘制图像直方图和可视化矩阵。 # 1. 绘制图像直方图 # 2. 可视化矩阵# 1. 绘制图…...

【论文笔记】Transformer^2: 自适应大型语言模型

Code repo: https://github.com/SakanaAI/self-adaptive-llms 摘要 自适应大型语言模型(LLMs)旨在解决传统微调方法的挑战,这些方法通常计算密集且难以处理多样化的任务。本文介绍了Transformer(Transformer-Squared)…...

【医学影像AI】50个眼科影像数据集(1)分类任务

【医学影像】50个眼科影像数据集(1)分类任务 【医学影像】50个眼科影像数据集(2)分割任务 【医学影像】50个眼科影像数据集(3)其它任务 【医学影像AI】50 个眼科影像数据集(1)分类任…...

2025年-G4--lc75--Best Time to Buy and Sell Stock(java版)

1.题目描述 2.思路 思路1: 3.java代码实现 class Solution {public int maxProfit(int[] prices) {// //初始化最小价格为最大值,最大利润为0// int minPriceInteger.MAX_VALUE;// int maxProfit0;// //遍历价格数组// for (int price : prices)// …...

STM32 PWM脉冲宽度调制介绍

目录 背景 PWM 模式 影子寄存器和预装载寄存器 PWM对齐模式 PWM 边沿对齐模式 向上计数配置 向下计数的配置 PWM 中央对齐模式 程序 第一步、使能GPIOB组、AFIO、TIM3外设时钟 第二步、输出通道端口配置​编辑 第三步、定时器配置产生频率 第四步、PWM输出配置 第…...

WebGPU顶点插槽(Vertex Buffer Slot)使用指南

本文将通过完整代码示例和逐行注释,详细解释WebGPU中顶点缓冲区的配置方法,特别针对shaderLocation参数与着色器的对应关系进行重点说明。 一、顶点数据定义与缓冲区创建 // 定义顶点数据结构(逻辑层) // 包含位置(position)、颜…...

JSP(学习自用)

一、本质 JSP解析后就是Servlet类的java代码。 二、jsp内嵌java代码 1、声明脚本 用于声明属性和方法。 <%!//声明脚本//用于声明属性和方法public void test(){}String easyName"张三"; %> 2、运行脚本 相当于在service方法中写代码 <% //运行脚本…...

ZYNQ TCP Server PS端千兆网口速率低问题,要修改BSP中LWIP配置参数

用VITIS教程里面 TCP UDP应用工程例程 打算测试PS端千兆网口速率。ZYNQ核心板用黑金的&#xff0c;外部板子自画的网口电路和其它电路。TCP SERVER时 iperf测试速率 只有60~70Mbit/s&#xff1f;然后用UDP SERVER方式&#xff0c;发现能达到 950Mbit/s&#xff1f;&#xff1f;…...

毕业设计—基于Spring Boot的社区居民健康管理平台的设计与实现

&#x1f393; 毕业设计大揭秘&#xff01;想要源码和文章&#xff1f;快来私信我吧&#xff01; Hey小伙伴们~ &#x1f44b; 毕业季又来啦&#xff01;是不是都在为毕业设计忙得团团转呢&#xff1f;&#x1f914; 别担心&#xff0c;我这里有个小小的福利要分享给你们哦&…...

【计算机网络】数据链路层数据帧(Frame)格式

在计算机网络中&#xff0c;数据帧&#xff08;Frame&#xff09; 是数据链路层的协议数据单元&#xff08;PDU&#xff09;&#xff0c;用于在物理介质上传输数据。数据帧的格式取决于具体的链路层协议&#xff08;如以太网、PPP、HDLC 等&#xff09;。以下是常见数据帧格式的…...

机器学习PCA和LDA

主成分分析&#xff08;PCA, Principal Component Analysis&#xff09;和线性判别分析&#xff08;LDA, Linear Discriminant Analysis&#xff09;是两种常用的降维方法&#xff0c;它们虽然都用于数据降维&#xff0c;但核心思想和应用场景不同。 PCA&#xff08;主成分分析…...

C#: String s = new String(“Hello“)无法编译?编程语言字符集有两个?为什么这种变量名“\u0061\u0062”都能编译通过?

C#: String s new String("Hello")无法编译? C# String类型是literal常量&#xff0c;默认不能用new创建&#xff0c;但可以在unsafe下用char *字符串指针创建。 char* charPtr stackalloc char[2]; charPtr[0] H; charPtr[1] \0; String myString new Strin…...

Visual Studio Code使用ai大模型编成

1、在Visual Studio Code搜索安装roo code 2、去https://openrouter.ai/settings/keys官网申请个免费的配置使用...

nlp|微调大语言模型初探索(1),LLaMA-Factory

前言 微调模型通常比从零开始训练一个模型的技术要求低。公司不需要拥有大量的深度学习专家&#xff0c;利用现有的开源工具和库&#xff08;如Hugging Face的Transformers等&#xff09;&#xff0c;中小型公司可以轻松地使用和微调大型模型&#xff0c;从而快速实现AI能力的集…...

c++TinML转html

cTinML转html 前言解析解释转译html类定义开头html 结果这是最终效果&#xff08;部分&#xff09;&#xff1a; ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6cf6c3e3c821446a84ae542bcc2652d4.png) 前言 在python.tkinter设计标记语言(转译2-html)中提到了将Ti…...

Gentleman:优雅的Go语言HTTP客户端工具包

gentlemen介绍&#xff0c;特点等 插件驱动架构&#xff1a;Gentleman的核心特点是其插件系统&#xff0c;允许用户注册和重用各种自定义插件&#xff0c;如重试策略或动态服务器发现&#xff0c;以增强HTTP客户端的功能。 中间件层&#xff1a;项目内置了一个上下文感知的层次…...

JDK1.8新特性面试题

lambda表达式 Lambda表达式极大地简化了匿名内部类的创建&#xff0c;促进了函数式编程风格。开发者可以更简洁地定义只有一行代码的函数对象&#xff0c;并将其作为参数传递给方法或者赋值给变量。 三要素&#xff1a; 形式参数、箭头、代码块 &#xff08;形式参数&#xf…...

Windchill-PDM-设置环境

Web 浏览器和 Java 插件版本 请确保 Windchill PDMLink 支持您使用的 Web 浏览器及 Java 插件的版本。PTC 软件对照表内列出了所支持的浏览器和插件。 软件一览表列出了平台、操作系统以及经认证可以在 Windows 和 UNIX 操作系统上与 此版本一起使用的第三方产品的组合。产品和…...

《蓝耘服务器:领先架构、技术创新与行业应用全景解析》

&#x1f31f; 嗨&#xff0c;我是Lethehong&#xff01;&#x1f31f; &#x1f30d; 立志在坚不欲说&#xff0c;成功在久不在速&#x1f30d; &#x1f680; 欢迎关注&#xff1a;&#x1f44d;点赞⬆️留言收藏&#x1f680; &#x1f340;欢迎使用&#xff1a;小智初学…...

前端【技术方案】重构项目

1. 明确重构目标 优化性能 减少页面加载时间降低资源占用 提升代码可维护性 更规范的代码风格更清晰的代码结构更明确的模块设计 扩展功能 为项目添加新功能改进现有功能 2. 评估项目现状 审查代码 全面检查现有代码&#xff0c;找出代码中的问题&#xff0c;如代码冗余、耦合…...

C#中反射的原理介绍及常见的应用场景介绍

反射&#xff08;Reflection&#xff09;是C#中的一种机制&#xff0c;允许程序在运行时获取类型信息并动态调用其成员。通过反射&#xff0c;程序可以访问程序集、模块、类型及其成员&#xff08;如方法、属性、字段等&#xff09;&#xff0c;并能在运行时创建对象、调用方法…...

uniapp webview嵌入外部h5网页后的消息通知

最近开发了个oa系统&#xff0c;pc端的表单使用form-create开发&#xff0c;form-create 是一个可以通过 JSON 生成具有动态渲染、数据收集、验证和提交功能的表单生成组件。移动端使用uniapp开发&#xff0c;但是因为form-create移动端只支持vant&#xff0c;不支持uniapp。官…...

java听书项目

项目的架构 网关:1路由转发 2.认证鉴权(token)3.统一处理(跨域) Mysql:关系型数据库 ES:搜索数据库 Redis:页面级缓存,会话状态存储 GitLab:私有托管平台 K8S:自动化部署、扩展和管理容器化应用程序的开源系统 Jenkins:自动化部署 1.环境搭建 创建一个父工程…...

iOS 获取设备占用内存

获取应用占用内存 获取应用进程占用内存 - (NSUInteger)memoryUsage {task_vm_info_data_t vmInfo;mach_msg_type_number_t count TASK_VM_INFO_COUNT;kern_return_t result task_info(mach_task_self(), TASK_VM_INFO, (task_info_t)&vmInfo, &count);if (result …...

C#功能测试

List 内部元素为引用 src[0]为"11" List<Source> src new List<Source>(); src.Add(new Source() { Name "1", Age 1, Description "1" }); src.Add(new Source() { Name "2", Age 2, Description "2"…...

js第八题

题八&#xff1a;滚动弹幕 要求&#xff1a; 1.页面上漂浮字体大小不一、颜色不一&#xff0c;从左向右滚动的弹幕&#xff1b; 2.底部中间有一个发送功能&#xff0c;可以发送新的弹幕&#xff1b; 3.底部的发送部分可以向下收起和弹出。 html <div id"danmu-con…...