SQLModel 教程:使用 OR 条件进行复杂查询
前言
在数据库操作中,我们经常需要根据多个条件来筛选数据。SQLModel 作为 Python 的 ORM 工具,提供了强大的查询功能。本教程将重点介绍如何使用 or_
操作符构建复杂的 OR 条件查询。
项目准备
首先,我们定义一个简单的 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 语句,方便调试。
创建测试数据
我们创建了 7 个英雄实例,年龄分布各不相同:
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)
OR 条件查询
核心部分是我们如何使用 or_
操作符构建查询:
statement = select(Hero).where(or_(Hero.age <= 35, Hero.age > 90))
这行代码的意思是:选择所有年龄小于等于 35 岁 或者 大于 90 岁的英雄。
查询逻辑解析
select(Hero)
- 从 Hero 表中选择数据.where(...)
- 添加筛选条件or_(条件1, 条件2)
- 表示满足条件1 或 条件2
预期结果
根据我们的测试数据:
- 年龄 ≤ 35:Tarantula(32), Black Lion(35)
- 年龄 > 90:Captain North America(93)
- 无年龄记录:不会被包含在结果中
因此查询结果应该包含 Tarantula、Black Lion 和 Captain North America 三位英雄。
实际应用场景
OR 条件在实际开发中非常常见,例如:
- 筛选特定状态(如"已发货"或"已完成"的订单)
- 查找特定年龄段的用户
- 多条件搜索功能
进阶思考
- 可以组合多个
or_
和and_
操作符构建更复杂的查询 - 对于 NULL 值处理要特别注意,上面的查询不会包含没有年龄记录的英雄
- 性能考虑:复杂的 OR 条件可能会影响查询性能,需要合理使用索引
总结
通过本教程,我们学习了:
- 如何使用 SQLModel 定义模型类
- 如何初始化数据库连接
- 如何使用
or_
操作符构建 OR 条件查询 - 理解了 OR 条件查询的实际应用场景
掌握这些基础查询技巧是使用 SQLModel 进行高效数据库操作的重要一步。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考