FastAPI+SQLAlchemy 异步 CRUD 完整示例

发布时间:2026/10/17 11:46:03

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: str1、新增数据 createapp.post(/user/add, response_modelUserRespSchema) async def add_user( req: UserCreateReqSchema, session: AsyncSession Depends(get_session) ): try: async with session.begin(): user User(usernamereq.username, emailreq.email, passwordreq.password) session.add(user) return user except Exception: raise HTTPException(status_code400, detail用户名或邮箱已经存在)2、删除数据 deleteapp.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_modelUserRespSchema) 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_modelList[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()只适用于同步 SQLAlchemyselect()。4、修改数据 update方式 1先查询对象修改对象属性执行 2 次 SQL可以直接返回修改后对象app.put(/user/update/{user_id}, response_modelUserRespSchema) 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: 数据修改成功}
延伸阅读

更多相关文章

2026/10/17 8:20:36

SCDLG:生成式抄袭检测与候选源重排序新方法

生成式模型的论文、作业、代码片段越来越多,如何判断一段文字究竟是“基于资料库的正常引用”,还是“对单一源头的隐性抄袭”,已经变成 NLP 和内容安全领域一个非常现实的问题。传统做法大多依赖表征相似度,也就是把两段文本分别编…

2026/10/12 15:59:52

DeepSeek与Kimi接入指南:从API调用到IDE插件配置全解析

在最近一段时间的开发工具链讨论里,DeepSeek 和 Kimi 是两个出现频率最高的国产大模型。标题里的“被抢疯了”放在技术圈,主要体现在开发者对这两家 API 的热情,以及 Codex 接入、VSCode 插件、IDEA 插件、本地部署、local proxy 转发等工具配…

2026/10/15 23:32:21

从SEIR到SEIDR:Python实现传染病建模与外部输入分析

1. 项目概述:从SEIR到SEIDR,当传染病模型遇见现实复杂性搞数学建模,尤其是传染病这块,兄弟们肯定对SEIR模型不陌生。S(易感者)、E(暴露者/潜伏者)、I(感染者)…

2026/10/17 11:45:20

ARM Cortex-M3 DesignStart包评估与SoC集成避坑指南

简介:面向嵌入式开发者的 Arm Cortex-M3 DesignStart Kit 压缩包,对应 ARM 官方 AT421-MN-80001-r0p0-00rel0 版本。它把 Cortex-M3 32 位 RISC 核心、参考工程与配套脚本打包在一起,常用于在 FPGA 中快速集成与评估该内核,适合 M…

2026/10/17 11:45:20

SpringBoot+Vue+MyBatis+MySQL企业人事系统架构实战解析

这套企业级人事管理系统,用的是SpringBoot Vue MyBatis MySQL这套相当经典的组合。市面上做人事系统的方案很多,有直接用SaaS平台的,有用Python Django写的,也有用PHP套模板的,但Java技术栈在这类企业级内部系统里一…

2026/10/17 11:45:20

Kappa架构:基于事件时间的实时数仓统一处理范式

1. 什么是Kappa架构?它不是“Lambda的简化版”,而是对实时数据处理本质的一次重新定义“实时数仓:Kappa架构”这个标题里,“实时数仓”是目标场景,“Kappa架构”是实现路径——但很多人一看到这个词,第一反…

2026/10/17 11:45:20

免费磁盘分区安全指南:备份、GPT/MBR识别与避坑实操

简介:易我分区大师(EASEUS Partition Master)是一款知名的磁盘分区管理工具,压缩包内提供免注册版本,适合需要调整分区容量、新建删除格式化卷、迁移系统以及解决硬盘空间不足的普通用户和运维人员。资源共879个文件&a…

2026/10/17 11:45:20

大模型微调实战指南:LoRA参数高效微调的原理、策略与避坑技巧

大概两年前,我接手了一个企业内部知识助手项目,最初走的是纯检索增强加提示工程的路子,效果始终卡在“看起来能说,但关键数字总是一本正经胡说八道”的瓶颈上。后来把方案切换成对基座模型做针对性微调,才真正解决了领…

2026/10/17 11:40:19

从AI生成到手工质感:ArtCraft创作工作流全解析

做艺术创作的人应该都有一个共同体验:用AI出图,速度是真的快,但“机器味”也是真的重。你让模型画一个陶艺工作室,它给你产出构图完美、光影正确、细节几乎没有瑕疵的图,可放大看,总觉得少了点人味&#xf…

2026/10/16 5:33:43

Python调用Gemini Structured Outputs实现工单路由门禁

客服工单最怕的不是模型“答错一句话”,而是它给出一段看起来合理的说明,程序却从中猜错优先级。通俗做法是:要求模型只交 JSON(JavaScript Object Notation,轻量数据格式),再让代码验证它。Gem…

2026/10/16 4:03:48

Spring Boot超市进销存系统毕设实战:从需求拆解到答辩通关

最近带的一个学生项目组里,有A同学跑来问我:选什么毕设题目最稳妥,既能让评审老师觉得工作量够,又不会在答辩时被问到语无伦次。我第一反应就是推荐基于Spring Boot的超市仓库管理系统——也就是超市进销存系统。这个题目乍一看平…

2026/10/15 13:42:16

Flutter StatefulWidget 生命周期核心解析

很多刚开始接触 Flutter 的朋友,在看完一堆“Hello World”和基础组件之后,大概率都会撞上同一堵墙:StatefulWidget 里那堆 initState、build、dispose 方法,到底什么时候被调用?为什么顺序是那样?在里面到…

2026/10/17 0:04:32

PlanarSLAM:面向曼哈顿世界的点线面联合SLAM系统

简介:本资源是面向机器人视觉与SLAM研究者的C开源RGB-D SLAM系统实现,专为结构化室内场景(如办公室、走廊)设计,通过融合点、线、平面三类几何特征并引入“曼哈顿世界”假设,显著提升位姿跟踪鲁棒性与稠密地…

2026/10/17 0:04:32

TDH Workflow调度实战:从DAG依赖驱动到任务编排与故障排查

1. 从一个调度脚本说起:TDH Workflow到底在解决什么问题第一次接触TDH的Workflow,是在一个数据清洗项目里。当时团队每天要跑几十个ETL任务,任务之间有严格的先后依赖——A表清洗完才能跑B表的关联,B表跑完才能触发C表的聚合。最开…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑