[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"article-public-p7VJICb3":3,"public-project-articles-p7VJICb3":17},{"id":4,"uuid":5,"project_id":6,"title":7,"content":8,"type":9,"status":10,"public_enabled":10,"views":11,"sort":12,"created_at":13,"updated_at":14,"project_title":15,"project_slug":16},1167,"p7VJICb3",57,"03. 零基础小白直接上手FastAPI开发增删改查接口","## 安装插件 防止数据库连接出现异常\n\n```python\npip install cryptography\n```\n\n## 专业接口测试工具\n\n[https:\u002F\u002Fwww.apipost.cn\u002F](https:\u002F\u002Fwww.apipost.cn\u002F)\n\n## JSON 教程\n\n[https:\u002F\u002Fwww.runoob.com\u002Fjson\u002Fjson-tutorial.html](https:\u002F\u002Fwww.runoob.com\u002Fjson\u002Fjson-tutorial.html)\n\n\u003C!-- 这是一张图片，ocr 内容为： -->\n![](https:\u002F\u002Fcdn.nlark.com\u002Fyuque\u002F0\u002F2026\u002Fpng\u002F751015\u002F1767688707137-73e1bbb4-fb8d-46a8-9caa-cc7bfe4c1ed8.png)\n\n## 数据库的操作结果 必须使用\u003Cfont style=\"color:#DF2A3F;\"> await\u003C\u002Ffont> 接收，否则没法正常获取结果\n\n```python\ndb_stu = await Student.get_or_none(no=student_model.no)\n```\n\n## 传递参数\n\n- 路径参数：\u002Fstudent\u002Fdelete\u002F{stu_id}    stu_id: int\u003C!-- 这是一张图片，ocr 内容为： -->\n  ![](https:\u002F\u002Fcdn.nlark.com\u002Fyuque\u002F0\u002F2026\u002Fpng\u002F751015\u002F1767688537216-745134ea-3606-44e5-bcb1-c2538369547b.png)\n- form 参数   ?no=xxx&name=xxx\n\n\u003C!-- 这是一张图片，ocr 内容为： -->\n![](https:\u002F\u002Fcdn.nlark.com\u002Fyuque\u002F0\u002F2026\u002Fpng\u002F751015\u002F1767688608307-c4ef507a-1a7e-4ebf-9ce7-4f362dc62220.png)\n\n- 一般新增、更新数据，需要传递 json 对象的情况\n\n```json\n{\n    \"id\": 1,\n    \"name\": \"青哥哥真帅\"\n}\n```\n\n## 假数据\n\n```sql\nINSERT INTO `fastapi_vue3`.`student` (`id`, `no`, `name`, `clazz`, `major`, `college`, `phone`, `email`, `address`) VALUES \n(1, '20231001', '青哥哥真帅', '计科1班', '计算机科学与技术', '计算机学院', '13699885599', 'qgg@163.com', '安徽合肥'),\n(2, '20231002', '张三', '计科1班', '计算机科学与技术', '计算机学院', '13800138001', 'zhangsan@163.com', '北京海淀'),\n(3, '20231003', '李四', '计科2班', '计算机科学与技术', '计算机学院', '13800138002', 'lisi@163.com', '上海浦东'),\n(4, '20231004', '王五', '软件1班', '软件工程', '计算机学院', '13800138003', 'wangwu@163.com', '广东深圳'),\n(5, '20231005', '赵六', '软件1班', '软件工程', '计算机学院', '13800138004', 'zhaoliu@163.com', '浙江杭州'),\n(6, '20231006', '钱七', '网络1班', '网络工程', '计算机学院', '13800138005', 'qianqi@163.com', '江苏南京'),\n(7, '20231007', '孙八', '网络1班', '网络工程', '计算机学院', '13800138006', 'sunba@163.com', '四川成都'),\n(8, '20231008', '周九', '数据1班', '数据科学', '计算机学院', '13800138007', 'zhoujiu@163.com', '湖北武汉'),\n(9, '20231009', '吴十', '数据1班', '数据科学', '计算机学院', '13800138008', 'wushi@163.com', '陕西西安'),\n(10, '20231010', '郑十一', '计科3班', '计算机科学与技术', '计算机学院', '13800138009', 'zhengshiyi@163.com', '重庆渝中'),\n(11, '20231011', '王小明', '软件2班', '软件工程', '计算机学院', '13800138010', 'wangxiaoming@163.com', '湖南长沙'),\n(12, '20231012', '李晓红', '计科1班', '计算机科学与技术', '计算机学院', '13800138011', 'lixiaohong@163.com', '山东济南'),\n(13, '20231013', '张伟', '网络2班', '网络工程', '计算机学院', '13800138012', 'zhangwei@163.com', '福建厦门'),\n(14, '20231014', '刘芳', '软件3班', '软件工程', '计算机学院', '13800138013', 'liufang@163.com', '辽宁沈阳'),\n(15, '20231015', '陈明', '数据2班', '数据科学', '计算机学院', '13800138014', 'chenming@163.com', '河南郑州'),\n(16, '20231016', '杨帆', '计科2班', '计算机科学与技术', '计算机学院', '13800138015', 'yangfan@163.com', '安徽芜湖'),\n(17, '20231017', '黄蓉', '软件1班', '软件工程', '计算机学院', '13800138016', 'huangrong@163.com', '江西南昌'),\n(18, '20231018', '周杰', '网络1班', '网络工程', '计算机学院', '13800138017', 'zhoujie@163.com', '云南昆明'),\n(19, '20231019', '吴刚', '数据1班', '数据科学', '计算机学院', '13800138018', 'wugang@163.com', '广西南宁'),\n(20, '20231020', '郑爽', '计科3班', '计算机科学与技术', '计算机学院', '13800138019', 'zhengshuang@163.com', '贵州贵阳'),\n(21, '20231021', '王磊', '软件2班', '软件工程', '计算机学院', '13800138020', 'wanglei@163.com', '山西太原');\n```\n\n\n## 本节课完整的代码\n\nmain.py\n\n```python\nimport uvicorn\nfrom fastapi import FastAPI\nfrom tortoise.contrib.fastapi import register_tortoise\n\nfrom settings import TORTOISE_ORM\nfrom routers import student\n\napp = FastAPI()\n\napp.include_router(student.router)\n\n# 注册 orm\nregister_tortoise(app, config=TORTOISE_ORM, add_exception_handlers=True)\n\n\nif __name__ == \"__main__\":\n    uvicorn.run(\"main:app\", reload=True, port=9090)\n\n```\n\n\nrouters\u002Fstudent.py\n\n```python\nfrom typing import Optional\n\nfrom fastapi import APIRouter, HTTPException\nfrom pydantic import BaseModel\nfrom models import Student\n\nrouter = APIRouter(prefix=\"\u002Fstudent\")\n\n\n# 接收数据的模型\nclass StudentModel(BaseModel):\n    id: Optional[int] = None\n    no: str | None = None\n    name: str | None = None\n    clazz: str | None = None\n    major: str | None = None\n    college: str | None = None\n    phone: str | None = None\n    email: str | None = None\n    address: str | None = None\n\n\n@router.get(\"\u002FselectAll\")\nasync def select_all(name: str = '', no: str = ''):\n    stu_list = await Student.filter(name__contains=name).filter(no__contains=no)\n    return stu_list\n\n\n@router.get(\"\u002FselectPage\")\nasync def select_all(name: str = '', no: str = '', pageNum: int = 1, pageSize: int = 10):\n    # 数据库的总共条数 total   # 当前查询页的数据 list\n    query = Student.filter(name__contains=name).filter(no__contains=no).order_by(\"-id\")\n    stu_list = await query.offset((pageNum - 1) * pageSize).limit(pageSize)\n    total = await query.count()\n    return {\"list\": stu_list, \"total\": total}\n\n\n@router.post(\"\u002Fadd\")\nasync def add_student(student_model: StudentModel):\n    if student_model.no is None:\n        raise HTTPException(status_code=400, detail=\"参数错误\")\n    # 根据学号查询\n    db_stu = await Student.get_or_none(no=student_model.no)\n    if db_stu is None:\n        # 参数模型转换成 字典数据\n        stu_dict = student_model.model_dump(exclude={\"id\"}, exclude_unset=True)\n        # **{\"no\": \"123\"}  =>  no=123\n        resp = await Student.create(**stu_dict)\n        return resp\n    else:\n        return None\n\n\n@router.put(\"\u002Fupdate\")\nasync def update_student(student_model: StudentModel):\n    if student_model.id is None:\n        raise HTTPException(status_code=400, detail=\"ID参数为空\")\n    # 参数模型转换成 字典数据\n    stu_dict = student_model.model_dump(exclude={\"id\"}, exclude_unset=True)\n    resp = await Student.filter(id=student_model.id).update(**stu_dict)   # update student set name = '青哥哥真帅' where id = 1\n    return resp\n\n\n@router.delete(\"\u002Fdelete\u002F{stu_id}\")\nasync def delete_student(stu_id: int):\n    resp = await Student.filter(id=stu_id).delete()\n    return resp\n\n\n# 导出 router\n__all__ = [\"router\"]\n\n```\n\n\n## 项目目录结构\n\n![](https:\u002F\u002Fapi.codenice.cn\u002Fapi\u002Fdrive\u002Fpublic\u002FcAEYzO03\u002Ffile)\n","coding",1,371,2279,"2026-01-06 17:43:27","2026-05-07 15:36:12.649662+00","FastAPI+Vue3零基础入门教程","fastapi-vue-zero",{"project":18,"items":19},{"id":6,"title":15,"slug":16},[20,28,35,36,43],{"id":21,"uuid":22,"project_id":6,"title":23,"type":9,"status":10,"public_enabled":10,"views":24,"sort":25,"created_at":26,"updated_at":27,"project_title":15,"project_slug":16},1162,"v00b56h7","01. 零基础小白直接上手Vue",847,2271,"2026-01-04 18:10:36","2026-05-03 22:49:02",{"id":29,"uuid":30,"project_id":6,"title":31,"type":9,"status":10,"public_enabled":10,"views":32,"sort":33,"created_at":34,"updated_at":27,"project_title":15,"project_slug":16},1165,"w9DeSyXA","02. 零基础小白直接上手FastAPI",446,2275,"2026-01-05 17:01:37",{"id":4,"uuid":5,"project_id":6,"title":7,"type":9,"status":10,"public_enabled":10,"views":11,"sort":12,"created_at":13,"updated_at":14,"project_title":15,"project_slug":16},{"id":37,"uuid":38,"project_id":6,"title":39,"type":9,"status":10,"public_enabled":10,"views":40,"sort":41,"created_at":42,"updated_at":27,"project_title":15,"project_slug":16},1172,"ptdUZ7z8","04. 零基础小白直接上手FastAPI+Vue3前后端分离开发",308,2292,"2026-01-07 16:54:01",{"id":44,"uuid":45,"project_id":6,"title":46,"type":9,"status":10,"public_enabled":10,"views":47,"sort":48,"created_at":49,"updated_at":27,"project_title":15,"project_slug":16},1173,"ngdkfhqL","05. 课程完整源码",194,2293,"2026-01-07 16:56:13"]