SQLModel 教程:使用 join 和 where 进行关联查询
概述
本文介绍如何在 SQLModel 中使用 join 和 where 子句进行关联查询操作。SQLModel 是一个结合了 SQLAlchemy 和 Pydantic 优势的 Python ORM 工具,可以让我们以更简洁的方式操作数据库。
数据模型定义
首先我们定义了两个数据模型:Team
(团队)和 Hero
(英雄),它们之间是一对多的关系:
class Team(SQLModel, table=True):
id: int | None = Field(default=None, primary_key=True)
name: str = Field(index=True)
headquarters: str
class Hero(SQLModel, table=True):
id: int | None = Field(default=None, primary_key=True)
name: str = Field(index=True)
secret_name: str
age: int | None = Field(default=None, index=True)
team_id: int | None = Field(default=None, foreign_key="team.id")
关键点:
Hero
模型中的team_id
字段通过foreign_key
参数关联到Team
表的id
字段- 两个模型都设置了必要的索引以提高查询效率
数据库初始化
我们使用 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()
函数创建了两个团队和三个英雄:
team_preventers = Team(name="Preventers", headquarters="Sharp Tower")
team_z_force = Team(name="Z-Force", headquarters="Sister Margaret's Bar")
hero_deadpond = Hero(name="Deadpond", secret_name="Dive Wilson", team_id=team_z_force.id)
hero_rusty_man = Hero(name="Rusty-Man", secret_name="Tommy Sharp", age=48, team_id=team_preventers.id)
hero_spider_boy = Hero(name="Spider-Boy", secret_name="Pedro Parqueador")
注意:
hero_spider_boy
没有设置team_id
,表示他不属于任何团队- 使用
session.refresh()
确保我们获取到最新的数据库状态
关联查询
核心部分在 select_heroes()
函数中,我们执行了一个关联查询:
statement = select(Hero).join(Team).where(Team.name == "Preventers")
results = session.exec(statement)
这个查询的含义是:
- 从
Hero
表中选择记录 - 通过
join(Team)
与Team
表关联 - 使用
where
条件筛选团队名称为 "Preventers" 的记录
最终会返回所有属于 "Preventers" 团队的英雄。
执行流程
main()
函数定义了完整的执行流程:
- 创建数据库和表结构
- 插入测试数据
- 执行关联查询并打印结果
实际应用场景
这种关联查询在实际开发中非常常见,例如:
- 查询某个部门的所有员工
- 查找某个分类下的所有商品
- 获取某个作者的所有文章
SQLModel 的语法简洁明了,让这类复杂查询变得非常简单。
总结
通过本文我们学习了:
- 如何定义有关联关系的模型
- 如何使用
join
进行表关联 - 如何结合
where
条件进行筛选 - SQLModel 的基本工作流程
SQLModel 的这种查询方式既保持了 SQLAlchemy 的强大功能,又提供了更符合 Python 风格的 API,是处理数据库操作的优秀选择。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考