SQLModel 教程:使用 join 进行表关联查询
概述
本文将深入讲解如何使用 SQLModel 进行表关联查询操作,重点介绍 join()
方法在实际应用中的使用方式。SQLModel 是一个结合了 SQLAlchemy 和 Pydantic 优势的 Python ORM 框架,能够简化数据库操作并保持类型安全。
数据模型定义
首先我们需要定义两个相关联的数据模型:Team
(团队)和 Hero
(英雄)。
class Team(SQLModel, table=True):
id: Optional[int] = Field(default=None, primary_key=True)
name: str = Field(index=True)
headquarters: str
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)
team_id: Optional[int] = Field(default=None, foreign_key="team.id")
这里的关键点在于:
Hero
模型中的team_id
字段通过foreign_key
参数指定了外键关系- 两个模型都继承自
SQLModel
并设置table=True
表示它们是数据库表 - 字段类型注解和
Field
配置提供了完整的类型提示和数据库约束
数据库连接与初始化
sqlite_file_name = "database.db"
sqlite_url = f"sqlite:///{sqlite_file_name}"
engine = create_engine(sqlite_url, echo=True)
def create_db_and_tables():
SQLModel.metadata.create_all(engine)
这段代码创建了一个 SQLite 数据库引擎,并通过 create_all()
方法根据模型定义创建所有表结构。
数据准备
在 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
,表示这个英雄不属于任何团队。
关联查询核心
最核心的部分是 select_heroes()
函数中的关联查询:
def select_heroes():
with Session(engine) as session:
statement = select(Hero).join(Team).where(Team.name == "Preventers")
results = session.exec(statement)
for hero in results:
print("Preventer Hero:", hero)
这段代码做了以下几件事:
- 创建查询语句,从
Hero
表开始 - 通过
join(Team)
指定与Team
表的关联 - 使用
where()
条件筛选团队名称为 "Preventers" 的记录 - 执行查询并遍历结果
实际应用场景
这种关联查询在实际开发中非常常见,例如:
- 查询某个部门的所有员工
- 查找某个分类下的所有商品
- 获取某个作者的所有文章
SQLModel 的 join()
方法让这类操作变得非常简单直观,同时保持了类型安全。
执行流程
当调用 main()
函数时,整个程序会按顺序执行:
- 创建数据库和表结构
- 插入测试数据
- 执行关联查询并输出结果
总结
通过本文的示例,我们学习了:
- 如何定义有关联关系的数据模型
- 如何使用
join()
进行表关联查询 - SQLModel 的基本 CRUD 操作流程
SQLModel 的这种设计既保留了 SQLAlchemy 的强大功能,又通过 Pydantic 的类型系统提供了更好的开发体验,是 Python ORM 领域的一个优秀选择。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考