Tortoise-ORM与FastAPI集成:异步模子定义与实践

打印 上一主题 下一主题

主题 1607|帖子 1607|积分 4821

title: Tortoise-ORM与FastAPI集成:异步模子定义与实践
date: 2025/04/20 11:38:23
updated: 2025/04/20 11:38:23
author: cmdragon
excerpt:
Tortoise-ORM通过类继承方式定义数据模子,每个模子类对应数据库中的一张表。模子字段类型与数据库类型自动映射,支持主键、唯一约束、索引等配置。模子间通过外键建立关联,支持异步查询和CRUD操作。FastAPI集成时,通过register_tortoise初始化数据库毗连,并结合Pydantic模子实现数据验证。常见错误包括字段验证失败和数据库毗连超时,可通过中间件和毗连池配置解决。
categories:
tags:

  • Tortoise-ORM
  • FastAPI
  • 异步数据库
  • 模子定义
  • 数据库配置
  • CRUD接口
  • 错误处置惩罚
扫描二维码关注或者微信搜一搜:编程智域 前端至全栈交流与成长
探索数千个预构建的 AI 应用,开启你的下一个伟大创意
第一章 Tortoise-ORM异步模子定义根本

1.1 模子类创建方法

在FastAPI项目中,数据模子是毗连业务逻辑与数据库的核心枢纽。Tortoise-ORM接纳类继承方式定义模子,每个模子类对应数据库中的一张表。以下是用户模子的完整示例:
  1. from tortoise.models import Model
  2. from tortoise import fields
  3. class User(Model):
  4.     id = fields.IntField(pk=True)  # 主键字段,自动递增
  5.     username = fields.CharField(max_length=50, unique=True)  # 唯一用户名
  6.     email = fields.CharField(max_length=100, index=True)  # 带索引的邮箱字段
  7.     created_at = fields.DatetimeField(auto_now_add=True)  # 自动记录创建时间
  8.     is_active = fields.BooleanField(default=True)  # 账户激活状态
  9.     credit = fields.DecimalField(max_digits=10, decimal_places=2, default=0.0)  # 精确数值存储
  10.     class Meta:
  11.         table = "auth_users"  # 自定义表名
  12.         ordering = ["-created_at"]  # 默认排序规则
复制代码
该模子在数据库中会天生如下结构的表(以PostgreSQL为例):
  1. CREATE TABLE auth_users
  2. (
  3.     id         SERIAL PRIMARY KEY,
  4.     username   VARCHAR(50)    NOT NULL UNIQUE,
  5.     email      VARCHAR(100)   NOT NULL,
  6.     created_at TIMESTAMP      NOT NULL,
  7.     is_active  BOOLEAN        NOT NULL,
  8.     credit     NUMERIC(10, 2) NOT NULL
  9. );
复制代码
1.2 字段类型映射原理

Tortoise-ORM的字段体系实现了Python类型与数据库类型的智能转换。当我们执行数据库迁徙时,ORM会自动根据模子字段类型天生对应的DDL语句:
Python字段类型PostgreSQL类型MySQL类型SQLite类型CharFieldVARCHARVARCHARTEXTUUIDFieldUUIDCHAR(36)TEXTDatetimeFieldTIMESTAMPDATETIME(6)TEXTJSONFieldJSONBJSONTEXTFloatFieldDOUBLE PRECISIONDOUBLEREAL特殊的字段参数:

  • auto_now_add=True:仅在对象创建时记录时间
  • auto_now=True:每次生存对象时更新时间
  • description='字段说明':天生数据库注释
  • db_index=True:创建独立索引(比index参数更灵活)
1.3 模子关联配置

关联关系配置是ORM的核心功能之一。我们通过外键字段建立模子间的关联:
  1. class Author(Model):
  2.     name = fields.CharField(max_length=100)
  3. class Book(Model):
  4.     title = fields.CharField(max_length=200)
  5.     author = fields.ForeignKeyField(
  6.         'models.Author',
  7.         related_name='books',
  8.         on_delete=fields.CASCADE
  9.     )
  10.     published_date = fields.DateField()
复制代码
关联查询示例:
  1. # 获取作者及其所有书籍
  2. author = await Author.filter(name="J.K. Rowling").prefetch_related('books')
  3. # 创建关联对象
  4. await Book.create(
  5.     title="Harry Potter and the Philosopher's Stone",
  6.     author=author,
  7.     published_date=date(1997, 6, 26)
  8. )
复制代码
第二章 FastAPI集成实践

2.1 数据库配置

在FastAPI启动配置中初始化数据库毗连:
  1. from fastapi import FastAPI
  2. from tortoise.contrib.fastapi import register_tortoise
  3. app = FastAPI()
  4. DB_CONFIG = {
  5.     "connections": {
  6.         "default": "postgres://user:password@localhost:5432/mydb"
  7.     },
  8.     "apps": {
  9.         "models": {
  10.             "models": ["models"],
  11.             "default_connection": "default",
  12.         }
  13.     },
  14.     "use_tz": True,  # 启用时区支持
  15.     "timezone": "Asia/Shanghai"
  16. }
  17. register_tortoise(
  18.     app,
  19.     config=DB_CONFIG,
  20.     generate_schemas=True,  # 自动生成表结构
  21.     add_exception_handlers=True  # 启用ORM异常处理
  22. )
复制代码
2.2 路由与模子结合

创建完整的CRUD接口示例:
  1. from pydantic import BaseModel
  2. from fastapi import APIRouter
  3. router = APIRouter()
  4. class UserCreate(BaseModel):
  5.     username: str
  6.     email: str
  7. @router.post("/users")
  8. async def create_user(user: UserCreate):
  9.     db_user = await User.create(**user.dict())
  10.     return {
  11.         "id": db_user.id,
  12.         "created_at": db_user.created_at.isoformat()
  13.     }
  14. @router.get("/users/{user_id}")
  15. async def get_user(user_id: int):
  16.     user = await User.get_or_none(id=user_id).values(
  17.         "username", "email", "created_at")
  18.     return user or {"error": "User not found"}
复制代码
第三章 课后Quiz

问题1:如何设置UUID主键?

A) id = fields.UUIDField()
B) id = fields.UUIDField(pk=True)
C) id = fields.UUIDField(primary_key=True)
正确答案:C
分析:在Tortoise-ORM中,设置主键必要显式指定primary_key参数。虽然pk是常用的快捷参数,但UUIDField必须使用完整的primary_key=True才华正确天生主键约束。
问题2:异步查询的上风包括?

A) 减少内存占用
B) 避免阻塞变乱循环
C) 进步CPU使用率
正确答案:B
分析:异步查询允许变乱循环在等待数据库相应时处置惩罚其他使命,特殊适合高并发的I/O麋集型场景。内存占用和CPU使用率主要与步伐实现方式相关,并非异步的直接上风。
第四章 常见报错解决方案

4.1 字段验证失败(422错误)

错误示例:
  1. {
  2.   "detail": [
  3.     {
  4.       "loc": [
  5.         "body",
  6.         "username"
  7.       ],
  8.       "msg": "ensure this value has at most 50 characters",
  9.       "type": "value_error.any_str.max_length"
  10.     }
  11.   ]
  12. }
复制代码
解决方法:

  • 检查哀求数据是否符合模子约束
  • 在Pydantic模子中设置相同的验证规则
  • 使用中间件捕捉验证非常:
  1. from fastapi.exceptions import RequestValidationError
  2. @app.exception_handler(RequestValidationError)
  3. async def validation_exception_handler(request, exc):
  4.     return JSONResponse(
  5.         status_code=400,
  6.         content={"detail": exc.errors()},
  7.     )
复制代码
4.2 数据库毗连超时

错误信息:
DBConnectionError: Can't connect to MySQL server on 'localhost'
排查步骤:

  • 验证数据库服务是否正常运行
  • 检查毗连字符串格式:dialect://user:password@host:port/dbname
  • 增长毗连池配置:
  1. DB_CONFIG = {
  2.     "connections": {
  3.         "default": {
  4.             "engine": "tortoise.backends.asyncpg",
  5.             "credentials": {
  6.                 "host": "localhost",
  7.                 "port": "5432",
  8.                 "database": "mydb",
  9.                 "user": "user",
  10.                 "password": "password",
  11.                 "minsize": 3,  # 最小连接数
  12.                 "maxsize": 20  # 最大连接数
  13.             }
  14.         }
  15.     }
  16. }
复制代码
余下文章内容请点击跳转至 个人博客页面 或者 扫码关注或者微信搜一搜:编程智域 前端至全栈交流与成长,阅读完整的文章:
Tortoise-ORM与FastAPI集成:异步模子定义与实践 | cmdragon's Blog
往期文章归档:

<ul>异步编程与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 立即注册

本版积分规则

缠丝猫

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