news 2026/8/27 8:41:31

FastAPI+SQLAlchemy 异步 CRUD 完整示例

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
FastAPI+SQLAlchemy 异步 CRUD 完整示例

统一采用session: AsyncSession = Depends(get_session)依赖注入方式,不使用中间件request.state.session;事务使用async with session.begin(),自动 com

依赖准备(前面已写)

from fastapi import FastAPI, Depends, HTTPException from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy import select, delete, update from pydantic import BaseModel from typing import List from models import AsyncSessionFactory, User app = FastAPI() # 依赖函数:获取数据库Session async def get_session(): session = AsyncSessionFactory() try: yield session finally: await session.close() # 响应Schema class UserRespSchema(BaseModel): id: int email: str username: str class Config: orm_mode = True # 创建用户请求Schema class UserCreateReqSchema(BaseModel): email: str username: str password: str

1、新增数据 create

@app.post("/user/add", response_model=UserRespSchema) async def add_user( req: UserCreateReqSchema, session: AsyncSession = Depends(get_session) ): try: async with session.begin(): user = User(username=req.username, email=req.email, password=req.password) session.add(user) return user except Exception: raise HTTPException(status_code=400, detail="用户名或邮箱已经存在!")

2、删除数据 delete

@app.delete("/user/delete/{user_id}") async def delete_user( user_id: int, session: AsyncSession = Depends(get_session) ): async with session.begin(): await session.execute( delete(User).where(User.id == user_id) ) return {"message": "删除成功!"}

3、查询数据 select

查询单条

@app.get("/user/select/{user_id}", response_model=UserRespSchema) async def select_user_by_id( user_id: int, session: AsyncSession = Depends(get_session) ): async with session.begin(): query = await session.execute( select(User.id, User.email, User.username).where(User.id == user_id) ) result = query.one()._asdict() return result

查询多条 + 模糊搜索、分页排序

@app.get("/user/list", response_model=List[UserRespSchema]) async def select_user_list( q: str | None = None, session: AsyncSession = Depends(get_session) ): from sqlalchemy import or_ stmt = select(User.id, User.username, User.email) if q: stmt = stmt.where( or_( User.email.contains(q), User.username.contains(q) ) ) # 分页、排序 stmt = stmt.limit(2).offset(0).order_by(User.id.desc()) query = await session.execute(stmt) result = [row._asdict() for row in query] return result

注意:session.query()只适用于同步 SQLAlchemy,select()

4、修改数据 update

方式 1:先查询对象,修改对象属性(执行 2 次 SQL,可以直接返回修改后对象)

@app.put("/user/update/{user_id}", response_model=UserRespSchema) async def update_user_obj( user_id: int, user_data: UserCreateReqSchema, session: AsyncSession = Depends(get_session) ): async with session.begin(): query = await session.execute(select(User).where(User.id == user_id)) user = query.scalars().first() user.email = user_data.email user.username = user_data.username return user

方式 2:直接 update 语句(只执行 1 次 SQL,不会刷新 ORM 对象)

@app.put("/user/update_direct/{user_id}") async def update_user_direct( user_id: int, user_data: UserCreateReqSchema, session: AsyncSession = Depends(get_session) ): async with session.begin(): await session.execute( update(User) .where(User.id == user_id) .values(**user_data.dict()) ) return {"message": "数据修改成功!"}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/27 8:39:20

Claude API故障应对指南:错误码解析与高可用客户端设计

如果你正在做 AI 应用开发,一定会对下面这个场景非常熟悉:某天早上打开工作群,运维同事发来一张截图,线上日志里全是 API error: 529 overloaded. This is a server-side issue, usually temporary ,紧接着用户开始反…

作者头像 李华
网站建设 2026/8/27 8:38:29

从star暴涨到本地验证:GitHub热榜开源项目筛选与评估指南

8月的 GitHub Trending 又一次把一批高增长项目推到台前。每次打开这个页面,总能看到几个仓库在短短几天内涨了几千 star。这种集中增长通常意味着两件事:要么某个技术方向正在快速发酵,要么某个工具确实解决了一个长期没被处理好的痛点。 这…

作者头像 李华
网站建设 2026/8/27 8:36:10

Linux软件编程(4)进程

最近学了Linux软件编程中进程的部分相关内容,进程和线程这一部分定义比较多,有的比较难以理解,建议搞懂、多背定义。 一、程序和进程 很多人会把程序和进程弄混,其实两者很好区分。 程序,是存放在磁盘上的代码文件&…

作者头像 李华
网站建设 2026/8/27 8:36:04

Altium Develop 注册、安装、使用教程

按实际使用顺序说明从注册到开始设计的完整流程。 一、注册并激活 1. 进入 Altium 官网 使用浏览器访问 Altium 官方网站: Altium 官网 (解决方案 - > Altium Develop,确认当前选择的是Altium Develop页面。) 填写邮件后提交…

作者头像 李华
网站建设 2026/8/27 8:30:51

PLC编程全流程解析:从需求到交付的工业自动化实战指南

1. 从“黑盒子”到“神经中枢”:理解PLC编程的本质 如果你刚接触工业自动化,可能会觉得PLC(可编程逻辑控制器)是个神秘的黑盒子,一堆复杂的梯形图和指令,让人望而生畏。但在我干了十几年自动化项目后&#…

作者头像 李华
网站建设 2026/8/27 8:29:51

数学建模竞赛中车辆路径问题的求解策略:从模型构建到算法实现

1. 赛题核心解读与破题思路 2023年大湾区杯数学建模竞赛的B题,其核心在于解决一个典型的资源优化与路径规划问题,通常涉及城市物流、应急物资调度或交通网络优化等场景。这类题目在数学建模竞赛中非常经典,但每年都会通过不同的背景设定和约束…

作者头像 李华