SQLModel 教程:使用 Python 3.10+ 进行表连接查询

SQLModel 教程:使用 Python 3.10+ 进行表连接查询

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

概述

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")

关键点说明:

  1. table=True 表示该模型同时对应数据库表
  2. Field 用于定义字段属性,如主键、索引等
  3. 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)

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

  1. 创建了一个查询语句,选择 HeroTeam 两个表
  2. 通过 join(Team) 指定了表连接
  3. 使用 where 条件筛选特定团队的英雄
  4. 执行查询并遍历结果

执行流程

整个程序的执行流程如下:

def main():
    create_db_and_tables()  # 创建数据库和表
    create_heroes()         # 插入测试数据
    select_heroes()         # 执行查询并输出结果

技术要点总结

  1. 表关系建模:通过外键字段建立模型间的关系
  2. 连接查询语法select().join().where() 是典型的 SQLAlchemy 查询模式
  3. 会话管理:使用 with 语句确保会话正确关闭
  4. 类型提示:Python 3.10+ 的 | 语法用于可选类型表示
  5. 调试支持echo=True 可以输出实际执行的 SQL

实际应用建议

在实际项目中,你可以:

  1. 将模型定义放在单独的模块中
  2. 使用更复杂的查询条件
  3. 添加错误处理和事务管理
  4. 考虑使用异步版本提高性能

SQLModel 的这种查询方式既保持了 Python 的简洁性,又提供了强大的数据库操作能力,非常适合中小型项目的快速开发。

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

打赏作者

晏闻田Solitary

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

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

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

打赏作者

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

抵扣说明:

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

余额充值