SQLModel 教程:使用 join 和 where 进行关联查询

SQLModel 教程:使用 join 和 where 进行关联查询

sqlmodel SQL databases in Python, designed for simplicity, compatibility, and robustness. sqlmodel 项目地址: https://gitcode.com/gh_mirrors/sq/sqlmodel

概述

本文介绍如何在 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)

这个查询的含义是:

  1. Hero 表中选择记录
  2. 通过 join(Team)Team 表关联
  3. 使用 where 条件筛选团队名称为 "Preventers" 的记录

最终会返回所有属于 "Preventers" 团队的英雄。

执行流程

main() 函数定义了完整的执行流程:

  1. 创建数据库和表结构
  2. 插入测试数据
  3. 执行关联查询并打印结果

实际应用场景

这种关联查询在实际开发中非常常见,例如:

  • 查询某个部门的所有员工
  • 查找某个分类下的所有商品
  • 获取某个作者的所有文章

SQLModel 的语法简洁明了,让这类复杂查询变得非常简单。

总结

通过本文我们学习了:

  1. 如何定义有关联关系的模型
  2. 如何使用 join 进行表关联
  3. 如何结合 where 条件进行筛选
  4. SQLModel 的基本工作流程

SQLModel 的这种查询方式既保持了 SQLAlchemy 的强大功能,又提供了更符合 Python 风格的 API,是处理数据库操作的优秀选择。

sqlmodel SQL databases in Python, designed for simplicity, compatibility, and robustness. sqlmodel 项目地址: https://gitcode.com/gh_mirrors/sq/sqlmodel

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

宗嫣惠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值