FastApi进阶(结合ORM使用Tortoise)

一、ORM简介

在这里插入图片描述
在实际项目中,肯定会用到数据库对一些数据进行持久化存储,就需要用到数据库了。Python 有许多现有和成熟的 ORM,不幸的是,它们的设计方式与 I/O 处理方式相反。 是相对较新的技术,具有不同的并发模型,最大的变化是关于 I/O 的处理方式。FastApi作为一个异步Web框架,如果使用同步数据库很明显不能把性能发挥到极致,所以这里推荐使用Tortise。

二、基本使用

官方文档:https://tortoise.github.io/
Tortoise ORM 是一个易于使用的 ORM(对象关系映射器),灵感来自 Django

1.python库安装

使用mysql数据库为例,需要安装下面两个库
在这里插入图片描述

pip install tortoise-orm
pip install "tortoise-orm[asyncmy]"

2.环境配置

  1. 先创建一个mysql的database ,名字叫 falearn
CREATE DATABASE falearn CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
  1. 在common/settings.py中进行配置
# ############## 数据库的配置信息 ###############
DATABASE = {
   
    'host': 'localhost',
    'port': 3306,
    # 自己的用户
    'user': 'root',
    # 自己的密码
    'password': 'xxxxx',
    'database': 'falearn',
}

# ############## 项目中的所以应用的models ###############
INSTALLED_APPS = [
    'apps.users.models',
]

# ############## tortoise的基本配置 ###############
TORTOISE_ORM = {
   
    'connections': {
   
        'default': {
   
            'engine': 'tortoise.backends.mysql',
            'credentials': DATABASE
        },
    },
    'apps': {
   
        'models': {
   
            'models': ['aerich.models', *INSTALLED_APPS],
            'default_connection': 'default',
        },
    }
}
  1. 在main.py中注册tortoise
from tortoise.contrib.fastapi import register_tortoise
from common import settings

register_tortoise(app, config=settings.TORTOISE_ORM, modules={
   'models': ['models']})

3. 定义模型

字段类型

Tortoise ORM 提供了多种字段类型,以下是一些常用的字段类型:
● IntField: 整数字段
● CharField: 字符字段
● TextField: 文本字段
● BooleanField: 布尔字段
● DateField: 日期字段
● DatetimeField: 日期时间字段
● FloatField: 浮点数字段

简单定义一个基础的User模型类

在apps每个项目自己的models文件中,定义各自的模型类(也就是数据库中的表),

# apps/users/models.py

from tortoise import models, fields

class Users(models.Model):
 id = fields.IntField(primary_key=True)
 username = fields.CharField(max_length=255, description="用户名", unique=True)
 password = fields.CharField(max_length=255, description="密码")
 email = fields.CharField(max_length=255, description="邮箱", default="")
 mobile = fields.CharField(max_length=255, description="手机号", default="")
 is_active = fields.BooleanField(default=True, description="是否激活")
 is_superuser = fields.BooleanField(default=False, description="是否超级管理员")
 created_at = fields.DatetimeField(auto_now_add=True, description="创建时间")

注意:每次定义后,都需要在settings中的INSTALLED_APPS添加

INSTALLED_APPS = [
    'apps.users.models',
]

4. 数据库迁移

建议使用 Aerich

pip install aerich

迁移命令:

  1. 在项目根目录下运行以下命令:
aerich init -t common.settings.TORTOISE_ORM
  • app.TORTOISE_ORM 是 Tortoise ORM 的配置路径。例如,如果 Tortoise 配置在 main.py 中,配置路径可以是 main.TORTOISE_ORM。
  • 执行完成后会生成迁移目录和一个迁移配置文件
    在这里插入图片描述
  1. 生成迁移文件,初始化 数据库:
aerich init-db

执行完成后,将会生成迁移文件
在这里插入图片描述
可以看到Users表创建成功
在这里插入图片描述

ps:如果后续对表模型进行了修改,那么需要先执行下面的命令生成迁移文件,再进行迁移

# 先执行命令生成迁移文件
aerich migrate
# 再执行命令迁移
aerich upgrade

三、Tortoise ORM 模型的语法(🌟)

1. 基础增删差改

添加数据

create(): 添加新数据到数据库
之前已经创建了一个用户模型对象,现在写一个接口,用于添加用户

  1. 创建pydatic模型
    在注册时,预期接收用户名, 密码,邮箱,手机号。如果全部写在api接口定义def register(username,passwrod,email,phone):就会显得很冗余,参数再多一些就更难写了。
    所以定义一个pydatic类型,界面看起来就会更美观一些。
# users/schemas.py
from pydantic import BaseModel, Field


class RegisterForm(BaseModel):
    username: str = Field(description="用户名", min_length=4, max_length=15)
    password: str = Field(description="密码", min_length=6, max_length=18)
    email: str = Field(description="邮箱")
    mobile: str = Field(description&
<think>好的,用户之前使用Flask,现在想迁移到FastAPI,需要了解如何用FastAPI进行项目开发。首先,我需要确定用户的具体需求是什么。他们可能已经熟悉Flask的某些功能,比如路由、扩展、项目结构等,现在想知道在FastAPI中如何实现类似的结构,以及迁移过程中需要注意哪些点。 用户提到“重构迁移到FastAPI”,可能意味着他们现有的Flask项目较大,需要逐步迁移或者完全重写。这时候,我需要比较Flask和FastAPI的主要差异,特别是在异步支持、依赖注入、数据验证等方面。同时,用户可能关心项目结构的最佳实践,如何组织路由、模型、配置等。 接下来,我需要考虑用户可能遇到的问题。比如,如何在FastAPI中处理数据库迁移(之前的问题提到Alembic),如何集成ORM(如SQLAlchemy或Tortoise-ORM),以及如何处理认证授权等常见功能。另外,用户可能对FastAPI的自动文档生成(Swagger和ReDoc)感兴趣,这也是一个亮点。 用户可能没有明确提到的深层需求包括性能优化、异步请求处理、测试策略、部署方式等。这些都是迁移到FastAPI时需要考虑的重要因素。例如,FastAPI基于Starlette支持异步,这对于高并发应用可能很重要,但用户需要了解如何正确使用async/await。 我需要确保回答结构清晰,分步骤介绍项目结构、核心模块实现、迁移步骤、注意事项等。同时,提供具体的代码示例和工具推荐,比如使用Alembic进行数据库迁移,或者推荐使用Pydantic进行数据验证,这些都能帮助用户更快上手。 另外,用户之前使用Flask,可能习惯了某些扩展,比如Flask-SQLAlchemy、Flask-Login等,需要解释在FastAPI中对应的工具或实现方式。例如,FastAPI没有内置的ORM,但可以结合SQLAlchemy或Tortoise-ORM,而认证可以通过OAuth2PasswordBearer等实现。 最后,需要提醒用户在迁移过程中注意测试,逐步替换模块,利用FastAPI的优势如类型提示、自动验证文档等。同时,可能推荐一些最佳实践,比如使用环境变量管理配置,使用Docker容器化部署,以及性能监控等。 总结来说,我需要提供一个全面的指南,涵盖项目结构、核心功能实现、迁移策略、工具推荐以及注意事项,帮助用户顺利从Flask迁移到FastAPI,并充分利用FastAPI的特性提升项目质量。</think>以下是如何用 FastAPI 构建项目的完整指南,包含 **项目结构设计**、**核心功能实现** 和 **迁移注意事项**,适用于从 Flask 迁移到 FastAPI 的场景: --- ### 一、项目结构设计(推荐方案) ```bash ├── app │ ├── main.py # 入口文件 │ ├── config.py # 配置管理(环境变量/配置文件) │ ├── database.py # 数据库连接与 ORM 初始化 │ ├── models # 数据模型 │ │ └── user.py # 示例:用户模型 │ ├── schemas # Pydantic 数据校验模型 │ │ └── user.py # 示例:用户请求/响应模型 │ ├── routes # 路由模块化拆分 │ │ ├── users.py # 用户相关路由 │ │ └── items.py # 其他业务路由 │ ├── dependencies.py # 自定义依赖项(如认证) │ └── utils # 工具类(日志、加密等) ├── tests # 单元测试 ├── requirements.txt # 依赖列表 ├── alembic # 数据库迁移(需初始化) └── Dockerfile # 容器化部署 ``` --- ### 二、核心模块实现 #### 1. **入口文件 (`app/main.py`)** ```python from fastapi import FastAPI from app.routes import users, items from app.database import engine, Base # 初始化 FastAPI app = FastAPI(title="My FastAPI Project") # 创建数据库表(生产环境建议用 Alembic 迁移) Base.metadata.create_all(bind=engine) # 挂载路由 app.include_router(users.router, prefix="/api/users", tags=["users"]) app.include_router(items.router, prefix="/api/items", tags=["items"]) ``` --- #### 2. **数据库配置 (`app/database.py`)** ```python from sqlalchemy import create_engine from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import sessionmaker # 异步引擎示例(需 SQLAlchemy 1.4+) # engine = create_async_engine("postgresql+asyncpg://user:pass@localhost/db") # 同步引擎(适合简单项目) SQLALCHEMY_DATABASE_URL = "sqlite:///./app.db" engine = create_engine(SQLALCHEMY_DATABASE_URL) SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine) Base = declarative_base() # 依赖注入获取数据库会话 def get_db(): db = SessionLocal() try: yield db finally: db.close() ``` --- #### 3. **路由与业务逻辑 (`app/routes/users.py`)** ```python from fastapi import APIRouter, Depends, HTTPException from sqlalchemy.orm import Session from app.schemas.user import UserCreate, UserResponse from app.models.user import User from app.database import get_db router = APIRouter() @router.post("/", response_model=UserResponse) def create_user(user: UserCreate, db: Session = Depends(get_db)): # 业务逻辑示例 db_user = db.query(User).filter(User.email == user.email).first() if db_user: raise HTTPException(status_code=400, detail="Email already registered") new_user = User(**user.dict()) db.add(new_user) db.commit() db.refresh(new_user) return new_user ``` --- #### 4. **Pydantic 数据模型 (`app/schemas/user.py`)** ```python from pydantic import BaseModel, EmailStr class UserBase(BaseModel): email: EmailStr username: str class UserCreate(UserBase): password: str class UserResponse(UserBase): id: int is_active: bool class Config: orm_mode = True # 允许从 ORM 对象自动转换 ``` --- ### 三、从 Flask 迁移的关键步骤 #### 1. **逐步替换策略** - **按模块迁移**:优先重构核心业务模块(如用户认证)。 - **并行运行**:使用反向代理(如 Nginx)将部分路由指向 FastAPI,逐步替换 Flask 路由。 - **共享数据库**:保持原有数据库结构,减少数据迁移成本。 --- #### 2. **功能对照实现** | Flask 功能 | FastAPI 替代方案 | |----------------------|-------------------------------------------| | `Flask-SQLAlchemy` | 原生 SQLAlchemy + `SessionLocal` 依赖注入 | | `Flask-Login` | JWT/OAuth2 + 自定义依赖项 | | `Flask-WTF` | Pydantic 模型 + 表单验证 | | `Flask-RESTful` | 原生 APIRouter + Pydantic 响应模型 | | `Flask-CORS` | `fastapi.middleware.cors.CORSMiddleware` | --- #### 3. **异步改造(可选)** 若需高性能异步支持: ```python # 使用 async def 定义路由 @router.get("/async-data") async def fetch_data(): result = await some_async_operation() return result # 异步数据库驱动(如 asyncpg + SQLAlchemy 1.4+) from sqlalchemy.ext.asyncio import AsyncSession async def get_async_db(): async with AsyncSession(engine) as session: yield session ``` --- ### 四、进阶工具推荐 1. **测试工具**: - `TestClient`:内置 HTTP 客户端 - `pytest`:配合 `pytest-asyncio` 测试异步代码 ```python from fastapi.testclient import TestClient client = TestClient(app) def test_create_user(): response = client.post("/api/users/", json={"email": "test@example.com", "password": "secret"}) assert response.status_code == 200 ``` 2. **部署优化**: - **容器化**:使用 `uvicorn` + `gunicorn` 多进程部署 ```Dockerfile FROM python:3.9 RUN pip install gunicorn uvicorn COPY . /app CMD ["gunicorn", "app.main:app", "--workers", "4", "--worker-class", "uvicorn.workers.UvicornWorker"] ``` 3. **监控**: - `Prometheus` + `Grafana`:集成 `starlette-prometheus` --- ### 五、注意事项 1. **依赖注入理解**:FastAPI 的依赖注入系统比 Flask 的上下文更灵活,但需要适应新范式。 2. **类型提示强制使用**:充分利用 Pydantic 和类型检查(IDE 支持更友好)。 3. **中间件差异**:FastAPI 中间件基于 Starlette,语法类似但细节不同。 4. **文档自动化**:访问 `/docs` 和 `/redoc` 自动生成交互式 API 文档。 --- ### 六、迁移收益 1. **性能提升**:异步支持使高并发场景响应更快。 2. **代码健壮性**:类型提示 + Pydantic 减少运行时错误。 3. **标准化接口**:自动生成 OpenAPI 文档,便于前后端协作。 4. **现代特性**:原生支持 WebSocket、GraphQL 等扩展。 通过以上步骤,你可以高效地将 Flask 项目迁移到 FastAPI,同时享受更强的类型安全性和性能优势。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ILUUSION_S

我在成都没饭吃😭

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

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

打赏作者

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

抵扣说明:

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

余额充值