SQLModel 教程:使用 WHERE 条件过滤查询结果
理解 SQLModel 中的 WHERE 条件查询
在数据库操作中,WHERE 子句是最常用的查询条件之一。SQLModel 作为 Python 的 ORM 工具,提供了简洁而强大的方式来构建带条件的查询语句。本教程将详细介绍如何使用 SQLModel 的 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、名称、秘密身份和年龄等属性。注意 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 个英雄实例并存入数据库:
hero_1 = Hero(name="Deadpond", secret_name="Dive Wilson")
hero_2 = Hero(name="Spider-Boy", secret_name="Pedro Parqueador")
# ...其他英雄实例
这些数据将用于演示 WHERE 条件查询。
WHERE 条件查询的核心用法
select_heroes()
函数展示了如何使用 where() 方法进行条件过滤:
statement = select(Hero).where(Hero.age > 35)
这行代码构建了一个查询,它会返回所有年龄大于 35 岁的英雄。SQLModel 会将这个 Python 表达式转换为适当的 SQL WHERE 子句。
查询结果处理
执行查询后,我们可以遍历结果:
results = session.exec(statement)
for hero in results:
print(hero)
这会打印出所有符合条件的英雄对象。
WHERE 条件的更多可能性
虽然示例中只展示了简单的数值比较,但 SQLModel 的 where() 方法支持更多复杂条件:
- 等于比较:
Hero.name == "Spider-Boy"
- 不等于:
Hero.age != 35
- 包含检查:
Hero.name.in_(["Spider-Boy", "Deadpond"])
- 字符串匹配:
Hero.name.like("%Boy%")
- 多条件组合:
where((Hero.age > 30) & (Hero.age < 50))
实际应用场景
WHERE 条件查询在实际开发中非常有用,例如:
- 用户管理系统中查询特定年龄段的用户
- 电商平台中筛选价格区间的商品
- 内容管理系统中查找特定状态的文章
最佳实践
- 对于频繁使用的查询条件,可以考虑封装为模型的方法
- 复杂的查询可以拆分为多个简单条件组合
- 使用参数化查询而非字符串拼接来防止 SQL 注入
- 对常用查询条件考虑添加数据库索引
总结
本教程展示了 SQLModel 中 WHERE 条件查询的基本用法。通过 where() 方法,我们可以构建各种复杂的查询条件,从数据库中精确获取我们需要的数据。SQLModel 的 API 设计保持了 Python 的简洁风格,同时提供了强大的数据库操作能力。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考