FastAPI与Tortoise-ORM实现关系型数据库关联

打印 上一主题 下一主题

主题 1914|帖子 1914|积分 5742

title: FastAPI与Tortoise-ORM实现关系型数据库关联
date: 2025/04/21 10:51:41
updated: 2025/04/21 10:51:41
author: cmdragon
excerpt:
FastAPI与Tortoise-ORM结合实现关系型数据库关联,支持1:1、1:N和M:N关系。1:N关系通过ForeignKeyField定义,M:N关系利用ManyToManyField处理。Pydantic模型用于数据验证和序列化,路由实现中通过prefetch_related优化查询性能。M:N关系通过中间表操作,支持复杂查询。常见报错包括422验证错误和外键束缚失败,可通过事务和范例检查解决。安装依赖后,利用uvicorn启动服务进行测试。
categories:

  • 后端开发
  • FastAPI
tags:

  • FastAPI
  • Tortoise-ORM
  • 关系型数据库
  • 1:N关系
  • M:N关系
  • 异步数据库操作
  • 数据库关联实现
扫描二维码关注或者微信搜一搜:编程智域 前端至全栈交流与成长
探索数千个预构建的 AI 应用,开启你的下一个伟大创意
一、FastAPI与Tortoise-ORM关系型数据库关联实现

1. 关系型数据库关联基础

在关系型数据库中,表与表之间的关联主要分为三种范例:

  • 1:1关系(如用户与身份证)
  • 1:N关系(如作者与书籍)
  • M:N关系(如门生与课程)
FastAPI通过Tortoise-ORM实现异步数据库操作时,利用ForeignKeyField和ManyToManyField
字段范例处理关联关系。相比同步ORM,异步实现须要特别注意await的利用和查询优化。
2. 1:N关系实现(作者与书籍案例)

2.1 模型定义
  1. # models.py
  2. from tortoise.models import Model
  3. from tortoise import fields
  4. class Author(Model):
  5.     id = fields.IntField(pk=True)
  6.     name = fields.CharField(max_length=255)
  7.     # 反向关系查询字段
  8.     books = fields.ReverseRelation["Book"]
  9. class Book(Model):
  10.     id = fields.IntField(pk=True)
  11.     title = fields.CharField(max_length=255)
  12.     author = fields.ForeignKeyField(
  13.         "models.Author",
  14.         related_name="books",
  15.         on_delete=fields.CASCADE
  16.     )
复制代码
2.2 Pydantic模型
  1. # schemas.py
  2. from pydantic import BaseModel
  3. class AuthorCreate(BaseModel):
  4.     name: str
  5. class BookCreate(BaseModel):
  6.     title: str
  7.     author_id: int
  8. class AuthorOut(BaseModel):
  9.     id: int
  10.     name: str
  11.     books: list[dict] = []
  12.     class Config:
  13.         orm_mode = True
复制代码
2.3 路由实现
  1. # main.py
  2. from fastapi import FastAPI, HTTPException
  3. from models import Author, Book
  4. from schemas import AuthorCreate, BookCreate, AuthorOut
  5. app = FastAPI()
  6. @app.post("/authors/", response_model=AuthorOut)
  7. async def create_author(author: AuthorCreate):
  8.     db_author = await Author.create(**author.dict())
  9.     return await AuthorOut.from_tortoise_orm(db_author)
  10. @app.get("/authors/{author_id}", response_model=AuthorOut)
  11. async def get_author(author_id: int):
  12.     author = await Author.get(id=author_id).prefetch_related("books")
  13.     if not author:
  14.         raise HTTPException(status_code=404, detail="Author not found")
  15.     return await AuthorOut.from_tortoise_orm(author)
复制代码
3. M:N关系实现(门生与课程案例)

3.1 模型定义
  1. # models.py
  2. class Student(Model):
  3.     id = fields.IntField(pk=True)
  4.     name = fields.CharField(max_length=255)
  5.     courses = fields.ManyToManyField(
  6.         "models.Course",
  7.         related_name="students",
  8.         through="student_course"
  9.     )
  10. class Course(Model):
  11.     id = fields.IntField(pk=True)
  12.     name = fields.CharField(max_length=255)
复制代码
3.2 中间表操作
  1. # 添加选课关系
  2. student = await Student.get(id=1)
  3. course = await Course.get(id=2)
  4. await student.courses.add(course)
  5. # 查询学生选课
  6. student_with_courses = await Student.get(id=1).prefetch_related("courses")
复制代码
3.3 复杂查询示例
  1. # 查询选修数学课的学生
  2. math_students = await Student.filter(
  3.     courses__name="Math"
  4. ).prefetch_related("courses")
复制代码
4. 课后Quiz

Q1:当建立1:N关系时,为什么要利用prefetch_related()方法?
A. 提高查询性能
B. 制止循环引用
C. 处理分页请求
D. 验证数据格式
正确答案:A
解析:prefetch_related()用于预加载关联数据,通过单次数据库查询获取全部相关纪录,制止N+1查询问题,显著提升查询效率。
Q2:M:N关系中,through参数的作用是什么?
A. 定义中间表名称
B. 指定关联字段范例
C. 设置级联删除规则
D. 声明索引字段
正确答案:A
解析:through参数用于自定义中间表名称,当须要向中间表添加额外字段时,可以显式创建中间模型。
5. 常见报错解决方案

报错1:422 Validation Error
  1. {
  2.   "detail": [
  3.     {
  4.       "loc": [
  5.         "body",
  6.         "author_id"
  7.       ],
  8.       "msg": "value is not a valid integer",
  9.       "type": "type_error.integer"
  10.     }
  11.   ]
  12. }
复制代码
解决方法:

  • 检查请求体数据格式是否符合JSON规范
  • 确认字段范例与Pydantic模型定义一致
  • 利用try/except捕获范例转换非常
报错2:IntegrityError外键束缚失败
  1. sqlite3.IntegrityError: FOREIGN KEY constraint failed
复制代码
解决方法:

  • 检查关联ID是否存在
  • 确认数据库事务完整性
  • 利用atomic()包裹关联操作:
  1. async with in_transaction():
  2.     author = await Author.create(name="J.K. Rowling")
  3.     await Book.create(title="Harry Potter", author=author)
复制代码
预防发起:

  • 始终在数据库操作中利用事务
  • 为关联字段添加索引
  • 利用select_related和prefetch_related优化查询
运行准备

安装依赖:
  1. pip install fastapi uvicorn tortoise-orm pydantic
复制代码
启动服务:
  1. uvicorn main:app --reload
复制代码
通过以上实现,开发者可以完整掌握FastAPI中异步数据库关联操作的核心要点。发起在Postman中测试接口时,重点关注关联数据的完整性和查询效率体现。
余下文章内容请点击跳转至 个人博客页面 或者 扫码关注或者微信搜一搜:编程智域 前端至全栈交流与成长,阅读完整的文章:FastAPI与Tortoise-ORM实现关系型数据库关联 | cmdragon's Blog
往期文章归档:

<ul>Tortoise-ORM与FastAPI集成:异步模型定义与实践 | cmdragon's Blog
异步编程与Tortoise-ORM框架 | cmdragon's Blog
FastAPI数据库集成与事务管理 | cmdragon's Blog
FastAPI与SQLAlchemy数据库集成 | cmdragon's Blog
FastAPI与SQLAlchemy数据库集成与CRUD操作 | cmdragon's Blog
FastAPI与SQLAlchemy同步数据库集成 | cmdragon's Blog
SQLAlchemy 核心概念与同步引擎设置详解 | cmdragon's Blog
FastAPI依赖注入性能优化计谋 | cmdragon's Blog
FastAPI安全认证中的依赖组合 | cmdragon's Blog
FastAPI依赖注入系统及调试技巧 | cmdragon's Blog
FastAPI依赖覆盖与测试环境模拟 | cmdragon's Blog
FastAPI中的依赖注入与数据库事务管理 | cmdragon's Blog
FastAPI依赖注入实践:工厂模式与实例复用的优化计谋 | cmdragon's Blog
FastAPI依赖注入:链式调用与多级参数传递 | cmdragon's Blog
FastAPI依赖注入:从基础概念到应用 | cmdragon's Blog
FastAPI中实现动态条件必填字段的实践 | cmdragon's Blog
FastAPI中Pydantic异步分布式唯一性校验 | cmdragon's Blog
掌握FastAPI与Pydantic的跨字段验证技巧 | cmdragon's Blog
FastAPI中的Pydantic密码验证机制与实现 | cmdragon's Blog
深入掌握FastAPI与OpenAPI规范的高级适配技巧 | cmdragon's Blog
Pydantic字段元数据指南:从基础到企业级文档增强 | cmdragon's Blog
Pydantic Schema天生指南:自定义JSON Schema | cmdragon's Blog
Pydantic递归模型深度校验36计:从无限嵌套到亿级数据的优化法则 | cmdragon's Blog
Pydantic异步校验器深:构建高并发验证系统 | cmdragon's Blog
Pydantic根校验器:构建跨字段验证系统 | cmdragon's Blog
Pydantic设置继承抽象基类模式 | cmdragon's Blog
Pydantic多态模型:用鉴别器构建范例安全的API接口 | cmdragon's Blog
FastAPI性能优化指南:参数解析与惰性加载 | cmdragon's Blog
FastAPI依赖注入:参数共享与逻辑复用 | cmdragon's Blog
FastAPI安全防护指南:构建坚不可摧的参数处理体系 | cmdragon's Blog
FastAPI复杂查询终极指南:告别if-else的现代化过滤架构 | cmdragon's Blog
FastAPI 核心机制:分页参数的实现与最佳实践 | cmdragon's Blog
<a href="https://blog.cmdragon.cn/posts/615a966b68d9/" target="_blank" rel="noopener nofollow">FastAPI 错误处理与自定义错误消息完全指南:构建健壮的 API 应用
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

数据人与超自然意识

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表