使用python时,数据库有分页,如何实现?

server/2024/11/14 15:12:10/

在 Python 中实现数据库分页一般是通过 SQL 查询中的 LIMITOFFSET 子句来实现的。以下是一个示例,展示如何在 ORM 设计中添加分页功能。

分页实现思路

  1. 确定每页记录数:用户可以指定每页显示的记录数量。
  2. 计算偏移量:根据当前页码和每页记录数计算 OFFSET 值。
  3. 更新查询逻辑:在查询方法中添加 LIMITOFFSET

修改后的 ORM 代码

在先前的 ORM 示例中,我们将 BaseModel 添加分页功能:

python">import sqlite3
from abc import ABC, abstractmethodclass Database:"""数据库连接管理类"""def __init__(self, db_name):self.connection = sqlite3.connect(db_name)self.cursor = self.connection.cursor()def commit(self):self.connection.commit()def close(self):self.connection.close()class BaseModel(ABC):"""模型基类"""@classmethod@abstractmethoddef table_name(cls):pass@classmethoddef create_table(cls, db: Database):"""创建表"""raise NotImplementedError("Subclasses must implement this method.")@classmethoddef all(cls, db: Database):"""获取所有记录"""db.cursor.execute(f"SELECT * FROM {cls.table_name()}")return db.cursor.fetchall()@classmethoddef insert(cls, db: Database, **kwargs):"""插入记录"""columns = ', '.join(kwargs.keys())placeholders = ', '.join(['?'] * len(kwargs))sql = f"INSERT INTO {cls.table_name()} ({columns}) VALUES ({placeholders})"db.cursor.execute(sql, tuple(kwargs.values()))db.commit()@classmethoddef delete(cls, db: Database, record_id):"""删除记录"""db.cursor.execute(f"DELETE FROM {cls.table_name()} WHERE id = ?", (record_id,))db.commit()@classmethoddef paginate(cls, db: Database, page: int, per_page: int):"""分页查询"""offset = (page - 1) * per_pagedb.cursor.execute(f"SELECT * FROM {cls.table_name()} LIMIT ? OFFSET ?", (per_page, offset))return db.cursor.fetchall()class User(BaseModel):"""用户模型"""@classmethoddef table_name(cls):return "users"@classmethoddef create_table(cls, db: Database):db.cursor.execute("""CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY AUTOINCREMENT,name TEXT NOT NULL,age INTEGER)""")db.commit()# 使用示例if __name__ == "__main__":db = Database("example.db")# 创建表User.create_table(db)# 插入数据User.insert(db, name="Alice", age=30)User.insert(db, name="Bob", age=25)User.insert(db, name="Charlie", age=35)User.insert(db, name="David", age=40)User.insert(db, name="Eve", age=28)# 分页查询page_number = 1  # 当前页码records_per_page = 2  # 每页记录数users_page_1 = User.paginate(db, page=page_number, per_page=records_per_page)print(f"第 {page_number} 页用户列表:", users_page_1)page_number = 2  # 查询下一页users_page_2 = User.paginate(db, page=page_number, per_page=records_per_page)print(f"第 {page_number} 页用户列表:", users_page_2)# 清理db.close()

代码说明

  1. paginate方法

    • 接受 pageper_page 参数。
    • 计算 OFFSET 的值。
    • 执行带有 LIMITOFFSET 的 SQL 查询以实现分页。
  2. 使用示例

    • 在插入多个用户后,调用 paginate 方法获取特定页的数据。

注意事项

  • 上述分页实现仅支持基本的分页功能,如需进一步实现更复杂的分页逻辑(如总页数、总记录数等),可以扩展该方法。
  • 进行分页查询时,应考虑索引的使用以提高性能,因为 OFFSET 随着页面数量的增加可能会导致性能下降。
  • 在使用其他类型的数据库时(如 MySQL 和 PostgreSQL),LIMITOFFSET 的用法是相似的,但在某些情况下可能需要调整 SQL 语法。

http://www.ppmy.cn/server/100115.html

相关文章

2024年第四届智慧城市与绿色能源国际会议(ICSCGE 2024)即将召开!

第四届国际智慧城市与绿色能源会议(ICSCGE 2024)将于2024年12月10-13日在澳大利亚悉尼举行,会议旨在汇聚来自世界各地的专家学者,共同讨论智慧城市框架及其在可持续发展和绿色能源领域的最新进展和创新成就。ICSCGE是一个致力于探…

SSHamble:SSH 服务的开源安全测试

runZero 发布了有关安全外壳 (SSH) 暴露的新研究,并推出了相应的开源工具 SSHamble。 该工具可帮助安全团队通过测试不常见但危险的错误配置和软件错误来验证 SSH 实施。 发现弱点 在 2024 年美国黑帽大会的演讲中,HD Moore 和 Rob King 分享了这项研…

谷粒商城实战笔记-175~177-商城业务-检索服务-检索查询接口开发

文章目录 一,175-商城业务-检索服务-检索查询参数模型分析抽取二,176-商城业务-检索服务-检索返回结果模型分析抽取三,177-商城业务-检索服务-检索DSL测试-查询部分四,178-商城业务-检索服务-检索DSL测试-聚合部分问题记录解决方案…

场景感知如何做到成为智能时代下的生活新维度

在日新月异的智能科技浪潮中,场景感知正逐步成为连接物理世界与数字世界的桥梁,深刻改变着我们的生活方式与交互体验。场景感知,简而言之,是指智能系统通过多种传感器和数据分析技术,实时理解并适应当前环境及用户状态…

Redis主从集群的搭建教程

集群结构: 我们搭建的主从集群结构如图: 共包含三个节点,一个主节点,两个从节点。 这里我们会在同一台云服务器中开启3个redis实例,模拟主从集群,信息如下: IPPORT角色192.168.150.1017001ma…

zdpgo_cobra_req 新增解析请求体内容

zdpgo_cobra_req 使用Go语言开发的,类似于curl的HTTP客户端请求工具,用于便捷的测试各种HTTP地址 特性 1、帮助文档都是中文的2、支持常见的HTTP请求,比如GET、POST、PUT、DELETE等 下载 git clone https://github.com/zhangdapeng520/z…

深入理解NPM版本范围预览锁定:策略、实践与示例

引言 NPM(Node Package Manager)是JavaScript世界中不可或缺的工具,它不仅帮助开发者管理项目依赖,还提供了强大的版本控制机制。版本范围预览锁定是NPM众多特性中的一个,它允许开发者锁定包的版本预览范围&#xff0…

git推送错误-->远程分支比本地的分支更新,无法直接推送

每次上传本地修改好的代码的时候,十次有八次都会出现这样的问题!!(暴躁!!!) 现在写个帖子记录一下,这个问题目前我还没有解决,欢迎懂的佬指点一下. 情景: 我在本地仓库做了一些代码的修改,准备上传到远程仓库上,下边是上传步骤: git add . # 将所有的修改都提交到缓冲区git …