SQLModel 教程:使用 offset 和 limit 实现分页查询
前言
在现代应用开发中,分页查询是最常见的数据库操作之一。SQLModel 作为 Python 的 ORM 工具,提供了简单直观的方式来实现分页功能。本文将深入讲解如何使用 SQLModel 的 offset 和 limit 方法来实现数据分页。
基础模型定义
首先我们需要定义一个基础的数据模型。在这个例子中,我们创建了一个 Hero
类来表示超级英雄:
class Hero(SQLModel, table=True):
id: Optional[int] = Field(default=None, primary_key=True)
name: str = Field(index=True)
secret_name: str
age: Optional[int] = Field(default=None, index=True)
这个模型包含四个字段:
id
: 自增主键name
: 英雄名称,建立了索引secret_name
: 秘密身份age
: 可选年龄字段,也建立了索引
数据库初始化
我们使用 SQLite 作为数据库后端,初始化代码如下:
sqlite_file_name = "database.db"
sqlite_url = f"sqlite:///{sqlite_file_name}"
engine = create_engine(sqlite_url, echo=True)
echo=True
参数会输出执行的 SQL 语句,方便调试。
数据准备
为了演示分页查询,我们需要先创建一些测试数据:
def create_heroes():
hero_1 = Hero(name="Deadpond", secret_name="Dive Wilson")
hero_2 = Hero(name="Spider-Boy", secret_name="Pedro Parqueador")
hero_3 = Hero(name="Rusty-Man", secret_name="Tommy Sharp", age=48)
hero_4 = Hero(name="Tarantula", secret_name="Natalia Roman-on", age=32)
hero_5 = Hero(name="Black Lion", secret_name="Trevor Challa", age=35)
hero_6 = Hero(name="Dr. Weird", secret_name="Steve Weird", age=36)
hero_7 = Hero(name="Captain North America", secret_name="Esteban Rogelios", age=93)
with Session(engine) as session:
session.add(hero_1)
# ... 添加其他英雄
session.commit()
这里我们创建了7个英雄实例并保存到数据库中。
分页查询实现
核心的分页查询功能通过 offset
和 limit
方法实现:
def select_heroes():
with Session(engine) as session:
statement = select(Hero).offset(3).limit(3)
results = session.exec(statement)
heroes = results.all()
print(heroes)
这段代码做了以下几件事:
- 创建一个查询语句,从
Hero
表中选择数据 - 使用
offset(3)
跳过前3条记录 - 使用
limit(3)
限制返回3条记录 - 执行查询并获取所有结果
分页原理
分页查询的两个关键参数:
- offset: 指定要跳过的记录数,相当于页码乘以每页大小
- limit: 指定每页返回的记录数
在我们的例子中,offset(3).limit(3)
表示:
- 跳过前3条记录(即第1页的3条记录)
- 返回接下来的3条记录(即第2页的内容)
实际应用场景
分页查询在以下场景中非常有用:
- Web 应用中的列表分页显示
- 移动应用中的懒加载
- 大数据集的批量处理
- API 设计中的分页响应
性能考虑
虽然 offset/limit 分页简单易用,但在大数据量时需要注意:
- 大 offset 值会导致性能下降,因为数据库需要扫描并跳过大量记录
- 对于深度分页,考虑使用基于游标的分页方式(如使用 id > last_id 条件)
总结
SQLModel 通过简单的 offset
和 limit
方法提供了强大的分页功能。本文展示了如何:
- 定义数据模型
- 初始化数据库
- 准备测试数据
- 实现基本分页查询
掌握这些知识后,你可以轻松地在自己的应用中实现分页功能,提升用户体验和系统性能。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考