第 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: Category5.4 从参数声明示例数据
使用Query、Path、Body的example参数:
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}

小结
本章学习了: - ✅ 在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]}

小结
本章学习了: - ✅ 使用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 users7.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操作 - ✅ 数据库关系(一对多、多对多)
后续章节将继续深入数据库关系、分页等高级主题。