SQLModel 教程:使用 Python 3.10+ 进行表连接查询
概述
SQLModel 是一个强大的 Python ORM 工具,它结合了 SQLAlchemy 和 Pydantic 的优点,提供了类型安全的数据模型定义和数据库操作能力。本教程将重点介绍如何使用 SQLModel 进行表连接查询操作。
数据模型定义
首先我们需要定义两个相关的数据模型: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")
关键点说明:
table=True
表示该模型同时对应数据库表Field
用于定义字段属性,如主键、索引等team_id
字段通过foreign_key
建立了与Team
表的外键关系
数据库连接与表创建
我们使用 SQLite 作为数据库后端:
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)
echo=True
参数会在控制台输出执行的 SQL 语句,便于调试。
数据初始化
我们创建了两个团队和三个英雄:
def create_heroes():
with Session(engine) as session:
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")
# 添加英雄记录...
session.commit()
# 刷新对象以获取数据库生成的值
session.refresh(hero_deadpond)
session.refresh(hero_rusty_man)
session.refresh(hero_spider_boy)
注意 session.refresh()
的调用,它用于从数据库重新加载对象,确保我们获取到的是最新数据。
表连接查询
核心部分是我们如何执行表连接查询:
def select_heroes():
with Session(engine) as session:
statement = select(Hero, Team).join(Team).where(Team.name == "Preventers")
results = session.exec(statement)
for hero, team in results:
print("Preventer Hero:", hero, "Team:", team)
这段代码做了以下几件事:
- 创建了一个查询语句,选择
Hero
和Team
两个表 - 通过
join(Team)
指定了表连接 - 使用
where
条件筛选特定团队的英雄 - 执行查询并遍历结果
执行流程
整个程序的执行流程如下:
def main():
create_db_and_tables() # 创建数据库和表
create_heroes() # 插入测试数据
select_heroes() # 执行查询并输出结果
技术要点总结
- 表关系建模:通过外键字段建立模型间的关系
- 连接查询语法:
select().join().where()
是典型的 SQLAlchemy 查询模式 - 会话管理:使用
with
语句确保会话正确关闭 - 类型提示:Python 3.10+ 的
|
语法用于可选类型表示 - 调试支持:
echo=True
可以输出实际执行的 SQL
实际应用建议
在实际项目中,你可以:
- 将模型定义放在单独的模块中
- 使用更复杂的查询条件
- 添加错误处理和事务管理
- 考虑使用异步版本提高性能
SQLModel 的这种查询方式既保持了 Python 的简洁性,又提供了强大的数据库操作能力,非常适合中小型项目的快速开发。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考