SQLAlchemy通用分页函数实现:支持搜索、排序和动态页码导航

ops/2025/2/7 3:03:08/

SQLAlchemy通用分页函数实现:支持搜索、排序和动态页码导航

在Web应用开发中,分页功能是一个非常常见的需求。本文将介绍一个基于SQLAlchemy的通用分页函数实现,该实现不仅支持基本的分页功能,还包含了搜索、排序以及动态页码导航等高级特性。

功能特点

  1. 基本分页功能(页码、每页数量)
  2. 灵活的排序支持(单字段/多字段,升序/降序)
  3. 关键词搜索(支持多字段模糊搜索)
  4. 动态页码导航(可配置显示页码数量)
  5. 丰富的分页信息(包含前后页、首末页等导航信息)

代码实现

from typing import Dict, Any, Sequence, TypeVar, Optional, Union
from sqlalchemy.orm import Query
from sqlalchemy import func, desc, asc, or_T = TypeVar('T')def paginate(query: Query, page: int = 1, per_page: int = 10, show_pages: int = 7,sort_by: Optional[Union[str, Sequence[str]]] = None,sort_desc: bool = True,search_query: Optional[str] = None,search_fields: Optional[Sequence[str]] = None
) -> Dict[str, Any]:"""通用分页函数Args:query: SQLAlchemy查询对象page: 当前页码per_page: 每页显示数量show_pages: 显示的页码数量sort_by: 排序字段,可以是字符串或字符串序列sort_desc: 是否降序排序,True为降序,False为升序search_query: 搜索关键词search_fields: 要搜索的字段列表Returns:包含分页数据和分页信息的字典"""# ... 具体实现代码 ...

核心功能解析

1. 搜索功能

函数支持多字段模糊搜索,通过ilike操作符实现:

if search_query and search_fields:model_class = query.column_descriptions[0]['entity']search_conditions = []for field in search_fields:field_obj = getattr(model_class, field)search_conditions.append(field_obj.ilike(f"%{search_query}%"))if search_conditions:query = query.filter(or_(*search_conditions))

2. 排序功能

支持单字段和多字段排序,可以指定升序或降序:

if sort_by:if isinstance(sort_by, str):sort_by = [sort_by]for field in sort_by:model_class = query.column_descriptions[0]['entity']sort_field = getattr(model_class, field)query = query.order_by(desc(sort_field) if sort_desc else asc(sort_field))

3. 动态页码导航

实现了动态页码范围计算,提供更好的用户体验:

half_show = show_pages // 2
if total_pages <= show_pages:page_range = range(1, total_pages + 1)
else:start_page = max(1, page - half_show)end_page = min(total_pages, start_page + show_pages - 1)if end_page - start_page < show_pages - 1:start_page = max(1, end_page - show_pages + 1)page_range = range(start_page, end_page + 1)

返回数据结构

函数返回一个包含两个主要部分的字典:

  1. items: 当前页的数据列表
  2. pagination: 分页信息对象,包含:
    • current_page: 当前页码
    • total_pages: 总页数
    • total: 总记录数
    • per_page: 每页显示数量
    • has_prev: 是否有上一页
    • has_next: 是否有下一页
    • page_range: 显示的页码范围
    • show_first: 是否显示首页
    • show_last: 是否显示末页
    • first_page: 首页页码
    • last_page: 末页页码

使用示例

# 基本分页查询
result = paginate(query=db.query(User),page=1,per_page=10
)# 带搜索和排序的分页查询
result = paginate(query=db.query(User),page=1,per_page=10,search_query="john",search_fields=["username", "email"],sort_by="created_at",sort_desc=True
)

总结

这个分页函数实现了一个功能完整、灵活可配置的分页解决方案。它不仅满足了基本的分页需求,还提供了搜索、排序等高级功能,可以在各种Web应用场景中使用。通过合理的参数设计和返回值结构,使得前端可以轻松实现各种分页导航界面。


http://www.ppmy.cn/ops/156325.html

相关文章

SpringSecurity密码编码器:使用BCrypt算法加密、自定义密码编码器

1、Spring Security 密码编码器 Spring Security 作为一个功能完备的安全性框架,一方面提供用于完成加密操作的 PasswordEncoder 组件,另一方面提供一个可以在应用程序中独立使用的密码模块。 1.1 PasswordEncoder 抽象接口 在 Spring Security 中,PasswordEncoder 接口代…

为AI聊天工具添加一个知识系统 之78 详细设计之19 正则表达式 之6

本文要点 要点 本项目设计的正则表达式 是一个 动态正则匹配框架。它是一个谓词系统&#xff1a;谓词 是运动&#xff0c;主语是“维度”&#xff0c;表语是 语言处理。主语的一个 双动结构。 Reg三大功能 语法验证、语义检查和 语用检验&#xff0c;三者 &#xff1a;语义约…

高阶开发基础——快速入门C++并发编程6——大作业:实现一个超级迷你的线程池

目录 实现一个无返回的线程池 完全代码实现 Reference 实现一个无返回的线程池 实现一个简单的线程池非常简单&#xff0c;我们首先聊一聊线程池的定义&#xff1a; 线程池&#xff08;Thread Pool&#xff09; 是一种并发编程的设计模式&#xff0c;用于管理和复用多个线程…

2024华为OD机试E卷-数大雁-(Python)

2024华为OD机试最新E卷题库-(C卷+D卷+E卷)-(JAVA、Python、C++) 目录 题目描述 输入描述 输出描述 用例1 用例2 用例3 用例4 考点 题目解析 代码 题目描述 一群大雁往南飞,给定一个字符串记录地面上的游客听到的大雁叫声,请给出叫声最少由几只大雁发出。 具体的…

CVPR | CNN融合注意力机制,芜湖起飞!

**标题&#xff1a;**On the Integration of Self-Attention and Convolution **论文链接&#xff1a;**https://arxiv.org/pdf/2111.14556 **代码链接&#xff1a;**https://github.com/LeapLabTHU/ACmix 创新点 1. 揭示卷积和自注意力的内在联系 文章通过重新分解卷积和自…

C++ Primer 标准库vector

欢迎阅读我的 【CPrimer】专栏 专栏简介&#xff1a;本专栏主要面向C初学者&#xff0c;解释C的一些基本概念和基础语言特性&#xff0c;涉及C标准库的用法&#xff0c;面向对象特性&#xff0c;泛型特性高级用法。通过使用标准库中定义的抽象设施&#xff0c;使你更加适应高级…

蓝桥杯思维训练营(三)

文章目录 题目详解680.验证回文串 II30.魔塔游戏徒步旅行中的补给问题观光景点组合得分问题 题目详解 680.验证回文串 II 680.验证回文串 II 思路分析&#xff1a;这个题目的关键就是&#xff0c;按照正常来判断对应位置是否相等&#xff0c;如果不相等&#xff0c;那么就判…

深度学习篇---张量数据流动处理

文章目录 前言第一部分&#xff1a;张量张量的基本概念1.维度标量&#xff08;0维&#xff09;向量&#xff08;1维&#xff09;矩阵&#xff08;2维&#xff09;三维张量 2.形状 张量运算1.基本运算加法减法乘法除法 2.广播3.变形4.转置5.切片6.拼接7.矩阵分解8.梯度运算&…