第 5 章: 声明示例数据


本章概述

学习如何在FastAPI中创建示例数据,用于自动API文档。


5.1 模型中的示例数据

使用schema_extra为Pydantic模型添加示例:

from pydantic import BaseModel

class Item(BaseModel):
    name: str
    description: str = None
    price: float
    tax: float = None
    
    class Config:
        schema_extra = {
            "example": {
                "name": "Foo",
                "description": "A very nice Item",
                "price": 35.4,
                "tax": 3.2,
            }
        }

5.2 嵌套关系中的示例

class User(BaseModel):
    username: str
    full_name: str = None
    
    class Config:
        schema_extra = {
            "example": {
                "username": "johndoe",
                "full_name": "John Doe"
            }
        }

class Item(BaseModel):
    name: str
    price: float
    owner: User  # 嵌套模型

5.3 选项列表

使用枚举或预定义列表作为示例:

from enum import Enum

class Category(str, Enum):
    food = "food"
    electronics = "electronics"
    clothing = "clothing"

class Item(BaseModel):
    name: str
    category: Category

5.4 从参数声明示例数据

使用QueryPathBodyexample参数:

from fastapi import FastAPI, Query, Body

app = FastAPI()

@app.post("/items/")
def create_item(
    q: str = Query(None, example="test"),
    item: Item = Body(
        example={
            "name": "Foo",
            "description": "A very nice Item",
            "price": 35.4,
            "tax": 3.2,
        }
    )
):
    return {"q": q, "item": item}

示例数据配置1 示例数据配置2 示例数据配置3


小结

本章学习了: - ✅ 在Pydantic模型中声明示例数据 - ✅ 嵌套模型中的示例 - ✅ 使用枚举定义选项 - ✅ 在参数中声明示例

这些示例会显示在自动生成的API文档中,帮助API使用者理解数据格式。


第 6 章: 文件上传


本章概述

学习如何在FastAPI中实现文件上传功能。


6.1 File类型

使用File接收上传的文件:

from fastapi import FastAPI, File, UploadFile

app = FastAPI()

@app.post("/uploadfile/")
def create_upload_file(file: bytes = File(...)):
    return {"file_size": len(file)}

6.2 UploadFile类型

UploadFile提供更好的性能(使用临时文件):

from fastapi import FastAPI, File, UploadFile

app = FastAPI()

@app.post("/uploadfile/")
async def create_upload_file(file: UploadFile = File(...)):
    return {
        "filename": file.filename,
        "content_type": file.content_type
    }

6.3 保存文件

from fastapi import FastAPI, File, UploadFile
import shutil

app = FastAPI()

@app.post("/uploadfile/")
def create_upload_file(file: UploadFile = File(...)):
    with open(f"uploads/{file.filename}", "wb") as buffer:
        shutil.copyfileobj(file.file, buffer)
    
    return {"filename": file.filename}

6.4 处理多个文件

from typing import List

@app.post("/uploadfiles/")
async def create_upload_files(files: List[UploadFile] = File(...)):
    return {"filenames": [file.filename for file in files]}

文件上传示例1 文件上传示例2


小结

本章学习了: - ✅ 使用File和UploadFile接收文件 - ✅ 保存上传的文件 - ✅ 处理多个文件上传


第 7 章: 数据库


本章概述

学习如何将FastAPI连接到关系数据库(如MySQL、PostgreSQL、SQLite)。


7.1 安装依赖

pip install sqlalchemy
pip install pymysql  # MySQL驱动
# 或
pip install psycopg2  # PostgreSQL驱动
# 或
pip install aiosqlite  # SQLite异步驱动

7.2 配置连接

from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

SQLALCHEMY_DATABASE_URL = "mysql+pymysql://user:password@localhost/dbname"

engine = create_engine(SQLALCHEMY_DATABASE_URL)
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)

Base = declarative_base()

7.3 创建模型(数据库表)

from sqlalchemy import Column, Integer, String
from database import Base

class User(Base):
    __tablename__ = "users"
    
    id = Column(Integer, primary_key=True, index=True)
    username = Column(String(50), unique=True, index=True)
    email = Column(String(100), unique=True, index=True)
    password = Column(String(100))

7.4 创建表

# 在应用启动时创建表
Base.metadata.create_all(bind=engine)

7.5 在路由中注入数据库会话

from fastapi import Depends
from sqlalchemy.orm import Session
from database import SessionLocal

def get_db():
    db = SessionLocal()
    try:
        yield db
    finally:
        db.close()

@app.get("/users/")
def read_users(db: Session = Depends(get_db)):
    users = db.query(User).all()
    return users

7.6 CRUD操作

# 创建
def create_user(db: Session, user: UserCreate):
    db_user = User(**user.dict())
    db.add(db_user)
    db.commit()
    db.refresh(db_user)
    return db_user

# 读取
def get_user(db: Session, user_id: int):
    return db.query(User).filter(User.id == user_id).first()

# 更新
def update_user(db: Session, user_id: int, user: UserUpdate):
    db_user = db.query(User).filter(User.id == user_id).first()
    for key, value in user.dict(exclude_unset=True).items():
        setattr(db_user, key, value)
    db.commit()
    return db_user

# 删除
def delete_user(db: Session, user_id: int):
    db_user = db.query(User).filter(User.id == user_id).first()
    db.delete(db_user)
    db.commit()

7.7 关系

一对多关系

class User(Base):
    __tablename__ = "users"
    id = Column(Integer, primary_key=True)
    tasks = relationship("Task", back_populates="owner")

class Task(Base):
    __tablename__ = "tasks"
    id = Column(Integer, primary_key=True)
    owner_id = Column(Integer, ForeignKey("users.id"))
    owner = relationship("User", back_populates="tasks")

小结

本章学习了: - ✅ 安装SQLAlchemy和数据库驱动 - ✅ 配置数据库连接 - ✅ 创建Pydantic模型和数据库模型 - ✅ 使用依赖注入管理数据库会话 - ✅ 实现CRUD操作 - ✅ 数据库关系(一对多、多对多)

后续章节将继续深入数据库关系、分页等高级主题。