FastAPI集成Mysql

362 阅读2分钟

总体步骤

  1. 配置config,主要配置数据库连接信息、模型类等
  2. 配置模型类
  3. 配置“请求数据结构”、“响应数据结构”
  4. 注册Tortoise ORM
  5. 配置请求接口

配置Config

config.py

# Tortoise ORM 配置,包含数据库连接和模型信息
TORTOISE_ORM = {
    "connections": {
        # "default" 是默认连接名称,MySQL 连接使用 "mysql://<用户名>:<密码>@<主机>:<端口>/<数据库名称>"
        "default": "mysql://root:123456@localhost:3306/resume"
    },
    "apps": {
        "models": {
            # "models" 表示模型的 Python 模块路径
            "models": ["models"],
            # 指定默认的数据库连接为上面配置的 "default"
            "default_connection": "default",
        }
    },
}

配置模型类

models.py

from tortoise import fields, models

# User 类定义了数据库中的 "users" 表结构
class User(models.Model):
    # 定义主键字段 "id",类型为整型,自增
    id = fields.IntField(pk=True)

    # "name" 字段,字符串类型,最大长度 50
    name = fields.CharField(max_length=50)

    # "email" 字段,字符串类型,最大长度 100,唯一值
    email = fields.CharField(max_length=100, unique=True)

    class Meta:
        # 表示该模型对应数据库中的 "users" 表
        table = "users"

    # 定义一个 __str__ 方法,便于调试和打印用户信息
    def __str__(self):
        return self.name

配置请求和响应结构

from pydantic import BaseModel


# UserCreate 模式, 用于创建用户的请求数据结构
class UserCreate(BaseModel):
    name: str   # 用户名,字符串类型
    email: str  # 用户邮箱,字符串类型

# UserResponse 模式,包含用户的 id,表示拥护数据的响应结构
class UserResponse(UserCreate):
    id: int

注册 Tortoise ORM 和 配置请求接口

from fastapi import FastAPI, HTTPException
from tortoise.contrib.fastapi import register_tortoise

from config import TORTOISE_ORM
from models import User
from schemas import UserResponse, UserCreate

# 创建 FastAPI 应用实例
app = FastAPI()

# 注册并初始化 Tortoise ORM
register_tortoise(
    app,
    config=TORTOISE_ORM,          # 加载配置文件中的 Tortoise ORM 配置
    generate_schemas=True,        # 为 True 时,应用启动时会自动生成数据库表结构
    add_exception_handlers=True,   # 自动添加异常处理
)

@app.post("/users/", response_model=UserResponse)
async def create_user(user: UserCreate):
    """
    创建用户的异步函数,接收 UserCreate 模式的请求数据。
    使用 Tortoise ORM 的 User.create() 方法将数据写入数据库。
    """
    db_user = await User.create(**user.model_dump())  # 使用 ** 解包,将 UserCreate 数据作为关键字参数传入
    return db_user  # 返回创建的用户对象

# 获取指定用户的 API 路由,使用 HTTP GET 方法,返回类型为 UserResponse
@app.get("/users/{user_id}", response_model=UserResponse)
async def get_user(user_id: int):
    """
    根据用户 ID 查找用户,返回用户数据。
    如果用户不存在,则返回 404 错误。
    """
    # 使用 Tortoise ORM 的 filter() 和 first() 方法进行查询
    user = await User.filter(id=user_id).first()
    if user is None:
        # 如果用户不存在,则抛出 HTTPException,状态码 404
        raise HTTPException(status_code=404, detail="User not found")
    return user  # 返回找到的用户对象