FastAPI零基础快速入门教程

本集视频在 B 站 BV1Byu76zEpf · P3

去 B 站看本集

03. 使用FastAPI实现查询API接口

数据库依赖函数 get_db

python
def get_db():
    """提供数据库会话:成功则 commit,异常则 rollback"""
    db = SessionLocal()
    try:
        yield db
        db.commit()
    except Exception:
        db.rollback()
        raise
    finally:
        db.close()

GoodsSchema

python
class GoodsSchema(BaseModel):
    model_config = ConfigDict(from_attributes=True)

    id: int | None = None
    name: str | None = None
    price: Decimal | None = None
    stock: int | None = None
    category_id: int | None = None
    category_name: str | None = None

查询所有商品 API

python
from fastapi import APIRouter, Depends
from sqlalchemy import select, or_
from sqlalchemy.orm import Session

from app.db.session import get_db
from app.models.category import Category
from app.models.goods import Goods
from app.schemas.goods import GoodsSchema
from app.schemas.response import Result

# /api/goods/all
router = APIRouter(prefix="/goods")

@router.get("/all")
def get_all_goods(keyword: str | None = None, db: Session = Depends(get_db)):
    """查询所有的商品列表"""
    result = []
    stmt = (
        select(Goods, Category.name)
        .outerjoin(Category, Category.id == Goods.category_id)
    )
    # select * from goods left join category on goods.category_id = category.id where goods.name like %豆%
    # order by goods.id desc
    if keyword:
        pattern = f"%{keyword}%"
        stmt = stmt.where(  # 要重新赋值
            or_(Goods.name.ilike(pattern), Category.name.ilike(pattern))
        )
    stmt = stmt.order_by(Goods.id.desc())
    rows = db.execute(stmt).all()
    for goods, category_name in rows:
        goods_schema = GoodsSchema.model_validate(goods)
        goods_schema.category_name = category_name
        result.append(goods_schema)
    return Result.success(data=result)

统一返回数据模型 Result、PageResult

python
from typing import Any, List

from pydantic import BaseModel

class Result(BaseModel):
    """通用返回对象"""

    code: int = 0
    msg: str = "请求成功"
    data: Any = None

    @staticmethod
    def success(data=None, msg: str = "操作成功") -> "Result":
        return Result(code=0, msg=msg, data=data)

    @staticmethod
    def error(code: int = 500, msg: str = "操作失败") -> "Result":
        return Result(code=code, msg=msg)

class PageResult(BaseModel):
    """分页结果"""
    list: List[Any]
    total: int