day01-FastAPI初识(补充day0.5)以及Tortoise-ORM

📅 2026/7/20 11:49:32 👁️ 阅读次数 📝 编程学习
day01-FastAPI初识(补充day0.5)以及Tortoise-ORM

# 路径参数与查询参数:

1.路径参数(Path Parameters):

指在路由路径后跟上参数,形如@app.get("/items/{id}"),路径参数是URL路径中的动态可变部分,格式为{参数名},用于标识「具体的资源」(如物品ID、用户ID)。例如:

  • /items/11是路径参数item_id的值
  • /users/100100是路径参数user_id的值

FastAPI会自动提取路径中的对应值,并传递给路由处理函数。

2.查询参数(Query Parameters):

查询参数是URL中?后面的键值对组合,格式为key1=value1&key2=value2,用于对资源进行「筛选、分页、排序」等辅助操作。例如:

  • /items?skip=0&limit=10skip(跳过条数)、limit(查询条数)是查询参数
  • /users?name=张三&age=20name(姓名)、age(年龄)是查询参数

核心特点:

  • 可选性:默认可省略,可设置默认值
  • 辅助性:不用于标识唯一资源,仅用于过滤、分页等
  • 灵活性:支持单个键对应多个值(如/items?tags=fruit&tags=cheap

3.区别:

对比维度

路径参数

查询参数

位置

URL路径中(/items/{item_id}

URL后缀(?skip=0&limit=10

必要性

必填(默认)

可选(默认,可设置必填)

核心用途

标识唯一资源(如ID、UID)

筛选、分页、排序等辅助操作

配置工具

Path

Query

示例场景

/items/1/users/100

/items?limit=10/users?name=张三

为什么需要Query类型注解?

基础的查询参数写法(如skip: int = 0)只能实现「类型校验+默认值」,但实际开发中需要更精细的控制:

  • 分页参数limit必须≥1且≤50(范围校验)
  • 搜索关键词q长度必须≤100(长度限制)
  • 筛选标签tags支持多个值传入(多值参数)
  • 接口文档需要显示查询参数的详细描述(元数据配置)

Query类型注解正是为解决这些问题而生,它是FastAPI提供的「查询参数高级配置工具」,与Path注解同源(均基于Pydantic),功能互补。

# Tortoise-ORM

我们在django框架的业务功能中采用过ORM查询,与之对应的,FastAPI也有其对应的ORM,称为:Tortoise-ORM

ORM 全称是 Object-Relational Mapping(对象关系映射) 。它的核心思想是:用 Python 类来代表数据库中的表,用类的实例来代表表中的一行记录.没有ORM时,我们需要手写SQL来操作数据库,代码量大且易出错.使用ORM后,我们仅需要操作 Python 对象.

ORM 的优势:

  • 面向对象:用 Python 代码替代 SQL 语句,更符合编程思维。
  • 安全性:自动进行参数化查询,防止 SQL 注入攻击。
  • 跨数据库:同一套代码可以无缝切换 SQLite、PostgreSQL、MySQL 等数据库。
  • 关系管理:自动处理表与表之间的外键、多对多等关系。
  • 可维护性:表结构集中定义在模型类中,修改和管理更方便。

为什么选择 Tortoise-ORM?

在 Python 异步 Web 开发中,传统的 ORM(如 SQLAlchemy 1.x 的同步模式)在执行数据库查询时会阻塞整个线程,这与 FastAPI 的异步非阻塞理念背道而驰。

Tortoise-ORM 的特点:

  • 原生异步:基于asyncio构建,所有数据库操作都是异步的,不会阻塞事件循环。
  • Django 风格的 API:如果你用过 Django ORM,会发现语法非常熟悉,上手极快。
  • 轻量级:专注于核心功能,没有冗余的抽象层,性能出色。
  • 完整的关系支持:支持外键、一对一、多对多等所有常见关系类型。
  • 内置 Pydantic 集成:可以通过pydantic_model_creator自动从 Tortoise 模型生成 Pydantic 模型,无缝对接 FastAPI 的请求/响应校验。

同步 ORM vs 异步 ORM 对比

维度

同步 ORM(如 Django ORM)

异步 ORM(Tortoise-ORM)

执行方式

阻塞当前线程

非阻塞,协程挂起

并发能力

依赖多线程/多进程

单线程高并发

语法

user = User.objects.get(id=1)

user = await User.get(id=1)

适用框架

Django、Flask

FastAPI、Sanic、aiohttp

后端 FastAPI 核心开发流程

  1. 初始化 FastAPI 主应用实例,配置跨域中间件,解决前端网页跨域请求报错
  2. 定义 Tortoise ORM 数据模型,和 MySQL 数据表字段一一映射,设置主键、默认值、自动创建 / 更新时间
  3. 编写 Pydantic 数据校验模型:约束前端传入参数的类型、长度、必填项,实现请求数据自动校验
  4. 逐个编写业务接口(全部使用async def异步函数,符合 Tortoise 异步 ORM 规范)
    • 登录接口:接收账号密码,模拟返回 Token 与用户信息(本次作业免后端鉴权校验)
    • 查询列表接口:接收查询参数(状态筛选、关键词搜索、排序规则),ORM 链式条件查询返回数据
    • 新增接口:接收表单参数,绑定固定用户 ID,ORM 插入单条数据
    • 编辑接口:根据路径参数 ID 定位数据,执行字段局部更新
    • 单字段状态修改接口:单独更新任务状态,附带业务逻辑(完成则写入完成时间,其他状态清空该字段)
    • 删除接口:根据 ID 删除对应数据
    • 数据统计接口:使用 ORM 计数聚合查询,统计各类任务数量
  5. 绑定 Tortoise ORM 与 FastAPI 项目,配置数据库连接地址,实现项目启动自动连接数据库
  6. 启动 uvicorn 服务,在浏览器/docs接口文档页面手动调试后端所有接口,确保单后端功能正常