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

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

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

概述

本文将深入讲解如何使用 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)

这段代码做了以下几件事:

  1. 创建查询语句,从 Hero 表开始
  2. 通过 join(Team) 指定与 Team 表的关联
  3. 使用 where() 条件筛选团队名称为 "Preventers" 的记录
  4. 执行查询并遍历结果

实际应用场景

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

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

SQLModel 的 join() 方法让这类操作变得非常简单直观,同时保持了类型安全。

执行流程

当调用 main() 函数时,整个程序会按顺序执行:

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

总结

通过本文的示例,我们学习了:

  1. 如何定义有关联关系的数据模型
  2. 如何使用 join() 进行表关联查询
  3. SQLModel 的基本 CRUD 操作流程

SQLModel 的这种设计既保留了 SQLAlchemy 的强大功能,又通过 Pydantic 的类型系统提供了更好的开发体验,是 Python ORM 领域的一个优秀选择。

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
发出的红包

打赏作者

童兴富Stuart

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

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

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

打赏作者

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

抵扣说明:

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

余额充值