SQLModel 教程:使用 where 条件筛选数据
理解 SQLModel 的条件查询
SQLModel 是一个结合了 SQLAlchemy 和 Pydantic 优势的 Python ORM 框架,它提供了简洁直观的方式来操作数据库。本教程将重点介绍如何使用 where 条件进行数据筛选,这是数据库操作中最常用的功能之一。
数据模型定义
首先我们定义了一个 Hero 数据模型,表示超级英雄:
class Hero(SQLModel, table=True):
id: Optional[int] = Field(default=None, primary_key=True)
name: str
secret_name: str
age: Optional[int] = None
这个模型包含四个字段:
- 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 语句,方便调试。
创建测试数据
create_heroes()
函数创建了 7 个英雄记录,包括他们的名称、秘密身份和年龄(部分英雄没有年龄信息)。
条件查询核心代码
重点在于 select_heroes()
函数中的条件查询:
statement = select(Hero).where(Hero.age >= 35).where(Hero.age < 40)
这行代码做了以下几件事:
select(Hero)
表示我们要查询 Hero 表- 第一个
where
条件筛选年龄大于等于 35 岁的英雄 - 第二个
where
条件进一步筛选年龄小于 40 岁的英雄
多个 where 条件会以 AND 逻辑连接,相当于 SQL 中的:
SELECT * FROM hero WHERE age >= 35 AND age < 40
执行查询与结果处理
查询执行后,我们遍历结果并打印:
results = session.exec(statement)
for hero in results:
print(hero)
实际应用场景
这种条件查询在实际开发中非常常见,例如:
- 筛选特定年龄段的用户
- 查询某个价格区间的商品
- 获取特定状态下的订单
条件查询的更多可能性
除了基本的比较运算符(>=, <),SQLModel 还支持:
- 等于:
Hero.name == "Deadpond"
- 不等于:
Hero.name != "Deadpond"
- 包含:
Hero.name.in_(["Deadpond", "Spider-Boy"])
- 模糊匹配:
Hero.name.like("%Boy%")
- 空值检查:
Hero.age.is_(None)
最佳实践建议
- 对于复杂的查询条件,可以拆分到多个 where 子句提高可读性
- 频繁使用的查询条件可以考虑封装为函数
- 注意处理可能为 None 的字段,避免运行时错误
- 在生产环境中,考虑添加适当的索引以提高查询性能
通过本教程,你应该已经掌握了 SQLModel 中使用 where 条件进行数据筛选的基本方法。这种链式调用的方式既保持了代码的简洁性,又提供了强大的查询能力。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考