Files
xit/sqlalchemy_fastapi_demo/api/c_lass.py
T
2026-09-21 19:14:15 +08:00

73 lines
3.7 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# # api/c_lass.py
# # 本文件定义班级的所有 API 路由(Controller 层)
from fastapi import APIRouter, Depends, HTTPException, Query
# APIRouter=创建路由,Depends=依赖注入,HTTPException=错误响应,Query=查询参数校验
from sqlalchemy.orm import Session # 会话类型
from database import get_db # 导入会话生成器
from dao.c_lass import create_c_lass, get_c_lass, get_all_c_lass, update_c_lass, delete_c_lass
# 把DAO层的5个函数都导入进来,接口里直接调用
from scheme.c_lass import ClassCreate, ClassUpdate, ClassResponse
# 路由对象,具体前缀(/c_lass)在 main.py 统一注册
router = APIRouter()# 创建本模块的路由对象,main.py会把它注册进应用
# ---------- 1. 新增班级 POST ----------
# 完整地址:POST /c_lass/add
@router.post("/add", response_model=ClassResponse, summary="新增班级")
# 装饰器:注册一个POST接口,路径/add;response_model=返回时按ClassResponse格式化
def add_c_lass(class_data: ClassCreate, db: Session = Depends(get_db)):
# class_data: ClassCreate = FastAPI自动校验请求体并转成对象;db = FastAPI自动注入会话
# 先查重:如果这个班级ID已经存在(包括逻辑删除的),进入if
if get_c_lass(db, class_data.class_id):
raise HTTPException(status_code=400, detail="该班级ID已存在,不能重复添加")
return create_c_lass(db, class_data)# 通过查重,调DAO层真正插入,返回结果
# ---------- 2. 根据id查询单个班级 GET ----------
# 完整地址:GET /c_lass/{class_id}
@router.get("/{class_id}", response_model=ClassResponse, summary="根据id查询班级")
# GET接口,路径里带班级编号,如 GET /c_lass/101
def get_class_by_id(class_id: int, db: Session = Depends(get_db)): # 调DAO查询
db_class = get_c_lass(db, class_id)
if not db_class:
raise HTTPException(status_code=404, detail="该班级不存在") # 查不到就返回404,带提示信息
return db_class
# ---------- 3. 分页查询所有班级 GET ----------
# 完整地址:GET /c_lass/?skip=0&limit=10
@router.get("/", response_model=list[ClassResponse], summary="分页查询班级列表")
# GET根路径,如 GET /c_lass/?skip=0&limit=10;response_model是列表
def get_class_list(
skip: int = Query(0, ge=0, description="跳过的记录数"), # 查询参数skip,默认0,必须≥0
limit: int = Query(10, ge=1, le=200, description="每页最大记录数"), # 查询参数limit,默认10,范围1~200
db: Session = Depends(get_db),
):
return get_all_c_lass(db, skip, limit) # 调DAO分页查询
# ---------- 4. 修改班级 PUT ----------
# 完整地址:PUT /c_lass/{class_id}
@router.put("/{class_id}/", response_model=ClassResponse, summary="修改班级信息")
def update_class(class_id: int, update_data: ClassUpdate, db: Session = Depends(get_db)):
# def update_class(class_id: int, start_time: date, db: Session = Depends(get_db)):
if not get_c_lass(db, class_id): # 先确认要改的班级存在(存在且没删)
raise HTTPException(status_code=404, detail="要修改的班级不存在")
return update_c_lass(db, class_id, update_data) # 调DAO执行局部更新
# ---------- 5. 删除班级 DELETE ----------
# 完整地址:DELETE /c_lass/{class_id}
@router.delete("/{class_id}", summary="删除班级")
def delete_class(class_id: int, db: Session = Depends(get_db)):
if not delete_c_lass(db, class_id):
raise HTTPException(status_code=404, detail="该班级不存在")
# 删除失败(查不到)返回404
return {"message": "删除成功"}
#API 层只做三件事—— 接请求、校验 / 查重、调 DAO,自己不写 SQL