SQLModel教程:使用FastAPI实现多模型CRUD操作

SQLModel教程:使用FastAPI实现多模型CRUD操作

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

前言

在构建现代Web应用时,数据模型的设计和API的创建是两个核心环节。SQLModel作为Python生态中一个强大的工具,它结合了SQLAlchemy和Pydantic的优点,能够帮助我们高效地处理数据库操作和数据验证。本教程将展示如何使用SQLModel和FastAPI构建一个支持多模型的英雄管理API。

项目结构解析

这个示例展示了一个完整的FastAPI应用,主要包含以下几个关键部分:

  1. 数据模型定义
  2. 数据库配置
  3. FastAPI路由和端点
  4. CRUD操作实现

数据模型设计

在SQLModel中,我们可以通过继承SQLModel类来定义数据模型。这个示例展示了如何设计一组相关的模型:

class HeroBase(SQLModel):
    name: str = Field(index=True)
    secret_name: str
    age: Optional[int] = Field(default=None, index=True)

class Hero(HeroBase, table=True):
    id: Optional[int] = Field(default=None, primary_key=True)

class HeroCreate(HeroBase):
    pass

class HeroPublic(HeroBase):
    id: int

模型分层设计

  1. HeroBase:基础模型,包含所有英雄共有的字段

    • name:英雄名称,建立索引提高查询效率
    • secret_name:秘密身份
    • age:可选年龄字段,同样建立索引
  2. Hero:数据库表模型,添加了主键字段id,并通过table=True标记为数据库表

  3. HeroCreate:创建英雄时使用的模型,继承自HeroBase

  4. HeroPublic:返回给客户端的模型,包含所有基础字段和id

这种分层设计遵循了"关注点分离"原则,使得:

  • 输入验证与数据库模型分离
  • 内部数据结构与公开API响应分离
  • 提高了代码的可维护性和安全性

数据库配置

sqlite_file_name = "database.db"
sqlite_url = f"sqlite:///{sqlite_file_name}"

connect_args = {"check_same_thread": False}
engine = create_engine(sqlite_url, echo=True, connect_args=connect_args)

这里配置了一个SQLite数据库:

  • echo=True会在控制台输出执行的SQL语句,便于调试
  • check_same_thread=False是SQLite在多线程环境下需要的配置

FastAPI应用初始化

app = FastAPI()

@app.on_event("startup")
def on_startup():
    create_db_and_tables()

应用启动时会自动创建数据库表,这是通过FastAPI的启动事件实现的。

API端点实现

创建英雄

@app.post("/heroes/", response_model=HeroPublic)
def create_hero(hero: HeroCreate):
    with Session(engine) as session:
        db_hero = Hero.model_validate(hero)
        session.add(db_hero)
        session.commit()
        session.refresh(db_hero)
        return db_hero

这个端点:

  1. 接收HeroCreate类型的请求体
  2. 使用上下文管理器创建数据库会话
  3. 将输入数据转换为Hero模型实例
  4. 添加到会话并提交到数据库
  5. 刷新实例以获取数据库生成的id
  6. 返回HeroPublic类型的响应

获取英雄列表

@app.get("/heroes/", response_model=List[HeroPublic])
def read_heroes():
    with Session(engine) as session:
        heroes = session.exec(select(Hero)).all()
        return heroes

这个端点:

  1. 使用SQLModel的select语句查询所有英雄
  2. 返回HeroPublic类型的列表
  3. 自动将数据库模型序列化为响应模型

技术要点总结

  1. 模型继承:通过继承实现DRY原则,避免重复定义字段

  2. 响应模型:FastAPI的response_model参数确保返回数据符合指定格式

  3. 数据库会话管理:使用上下文管理器(with语句)确保会话正确关闭

  4. 类型安全:全程使用Python类型提示,提高代码可靠性

  5. 自动验证:SQLModel基于Pydantic,自动处理输入数据验证

扩展思考

这种模式可以轻松扩展到更复杂的场景:

  • 添加更多模型和关系
  • 实现更复杂的查询
  • 添加用户认证
  • 实现分页和过滤

通过SQLModel和FastAPI的组合,开发者可以快速构建出类型安全、结构清晰的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、付费专栏及课程。

余额充值