当前位置: 首页 > article >正文

【FastAPI】 + SQLAlchemy 异步 ORM 实现完整 CRUD 操作

从零实战FastAPI SQLAlchemy 异步 ORM 实现完整 CRUD 操作附完整代码一、为什么要学「FastAPI SQLAlchemy 异步 ORM」在现代 Web 服务中数据库是核心组件。然而传统同步操作如MySQLdb在高并发场景下容易成为瓶颈。FastAPI SQLAlchemy 异步 ORM 的组合具备以下优势✅ 高性能异步非阻塞 I/O✅ 代码简洁面向对象建模✅ 安全可靠SQL 注入防护✅ 自动生成 API 文档Swagger UI✅ 与 Pydantic 完美结合实现数据验证本文将基于你今天学习的完整内容带你从零实现一个完整的图书管理系统的 CRUD 功能二、环境准备开发前置pipinstallfastapi uvicorn sqlalchemy sqlalchemy-asyncio aiomysql pydantic✅ 推荐使用uvicorn启动服务uvicorn main:app--reload三、核心步骤一定义模型类ORM 映射fromsqlalchemyimportDateTime,funcfromsqlalchemy.ormimportDeclarativeBase,Mapped,mapped_columnfromdatetimeimportdatetimeclassBase(DeclarativeBase):# 自动生成创建与更新时间create_time:Mapped[datetime]mapped_column(DateTime,insert_defaultfunc.now(),defaultfunc.now(),comment创建时间)update_time:Mapped[datetime]mapped_column(DateTime,insert_defaultfunc.now(),defaultfunc.now(),onupdatefunc.now(),comment更新时间)classBook(Base):__tablename__bookid:Mapped[int]mapped_column(primary_keyTrue,commentID)name:Mapped[str]mapped_column(String(255),comment书名)author:Mapped[str]mapped_column(String(255),comment作者)price:Mapped[float]mapped_column(Float,comment价格)publisher:Mapped[str]mapped_column(String(255),comment出版社)classUser(Base):__tablename__userid:Mapped[int]mapped_column(primary_keyTrue,commentID)username:Mapped[str]mapped_column(String(255),comment用户名)password:Mapped[str]mapped_column(String(255),comment密码)email:Mapped[str]mapped_column(String(255),comment邮箱)✅ ✅ 小技巧所有模型继承Base自动拥有时间字段四、核心步骤二创建数据库引擎 会话工厂fromsqlalchemy.ext.asyncioimportcreate_async_engine,async_sessionmaker ASYNC_DATABASE_URLmysqlaiomysql://root:123456localhost:3306/FastAPI_first?charsetutf8mb4async_enginecreate_async_engine(ASYNC_DATABASE_URL,echoTrue,pool_size20,max_overflow10,pool_recycle3600)# 创建会话工厂Async_sessionLocalasync_sessionmaker(bindasync_engine,class_AsyncSession,expire_on_commitFalse# 关键避免提交后对象失效)五、核心步骤三依赖注入 —— 获取数据库会话fromfastapiimportDepends,HTTPExceptionasyncdefget_db():asyncwithAsync_sessionLocal()assession:try:yieldsessionexceptException:awaitsession.rollback()raisefinally:awaitsession.close()从此每个路由函数都可以通过db: AsyncSession Depends(get_db)自动获取数据库连接六、核心步骤四CRUD 完整路由实现精华1. 查询所有书籍GET /book/booksapp.get(/book/books)asyncdefget_book_list(db:AsyncSessionDepends(get_db)):resultawaitdb.execute(select(Book))booksresult.scalars().all()returnbooks2. 查询单个书籍按 IDapp.get(/book/book/{id})asyncdefget_book_by_id(id:int,db:AsyncSessionDepends(get_db)):resultawaitdb.execute(select(Book).where(Book.idid))bookresult.scalars().first()ifnotbook:raiseHTTPException(status_code404,detail书籍不存在)returnbook3. 模糊查询LIKEapp.get(/book/search_book_like)asyncdefsearch_book_like(name:str,db:AsyncSessionDepends(get_db)):resultawaitdb.execute(select(Book).where(Book.name.like(f%{name}%)))booksresult.scalars().all()returnbooks4. 聚合查询MAX、SUM、AVGapp.get(/book/count)asyncdefget_book_count(db:AsyncSessionDepends(get_db)):resultawaitdb.execute(select(func.sum(Book.price)))total_priceresult.scalar()return{total_price:total_price}5. 分页查询OFFSET LIMITapp.get(/book/page)asyncdefget_page(page:int1,page_size:int3,db:AsyncSessionDepends(get_db)):resultawaitdb.execute(select(Book).offset((page-1)*page_size).limit(page_size))booksresult.scalars().all()returnbooks6. 增加书籍POST /book/add_bookfrompydanticimportBaseModelclassBookCreate(BaseModel):name:strauthor:strprice:floatpublisher:strapp.post(/book/add_book)asyncdefadd_book(book:BookCreate,db:AsyncSessionDepends(get_db)):book_objBook(**book.dict())db.add(book_obj)awaitdb.commit()awaitdb.refresh(book_obj)returnbook_obj自动校验类型无须手动判断数据合法性7. 更新书籍PUT /book/update_book/{id}classBookUpdate(BaseModel):name:strauthor:strprice:floatpublisher:strapp.put(/book/update_book/{id})asyncdefupdate_book(id:int,book:BookUpdate,db:AsyncSessionDepends(get_db)):book_objawaitdb.get(Book,id)ifnotbook_obj:raiseHTTPException(status_code404,detail书籍不存在)book_obj.namebook.name book_obj.authorbook.author book_obj.pricebook.price book_obj.publisherbook.publisherawaitdb.commit()returnbook_obj8. 删除书籍DELETE /book/delete_book/{id}app.delete(/book/delete_book/{id})asyncdefdelete_book(id:int,db:AsyncSessionDepends(get_db)):book_objawaitdb.get(Book,id)ifnotbook_obj:raiseHTTPException(status_code404,detail书籍不存在)awaitdb.delete(book_obj)awaitdb.commit()return{message:删除成功}七、核心亮点总结技能说明✅Depends(get_db)自动注入数据库会话避免重复代码✅select().where()SQL 查询构建器比原生 SQL 更安全✅scalars().all()提取 ORM 对象列表✅await db.commit()提交事务✅Pydantic Model请求数据自动校验✅HTTPException统一错误处理✅expire_on_commitFalse防止“对象失效”问题

相关文章:

【FastAPI】 + SQLAlchemy 异步 ORM 实现完整 CRUD 操作

🚀从零实战:FastAPI SQLAlchemy 异步 ORM 实现完整 CRUD 操作(附完整代码) 一、为什么要学「FastAPI SQLAlchemy 异步 ORM」? 在现代 Web 服务中,数据库是核心组件。然而,传统同步操作&#x…...

最小二乘问题详解15:束平差原理与基础实现

初始两帧的 E 矩阵分解可能存在错误解或尺度模糊;三角化结果受位姿误差和图像噪声影响;PnP 的位姿估计会继承并放大前期误差。 随着图像数量增加,这些局部误差会不断累积,导致最终重建结果出现尺度漂移、结构扭曲甚至拓扑错误。要…...

记录生活中的一件小事(佚名整理)

(转发需官方授权)记录生活中的一件小事(佚名整理)(佚名整理)记录生活中的一件小事,如果喊错了那才是麻烦事情的开始:曾经有一个人家里有两个姐姐,这个人上高中的时候和两…...

olonCode v0.0.20 发布 - 编程智能体(新增子代理和浏览器能力)

关于 SolonCode(编程智能体)SolonCode 是由杭州无耳科技有限公司,基于 Java 8 Solon AI 开发的 “Claude Code” 国产开源实现版本。它不仅是一个 AI 终端智能助手(帮你查资料、写报告、发邮件,生成图片、视频&#x…...

别再乱用get()了!Python字典setdefault()的3个进阶技巧(含性能对比)

别再乱用get()了!Python字典setdefault()的3个进阶技巧(含性能对比) 字典操作是Python开发中最频繁的基础动作之一,但很多中高级开发者依然停留在get()方法的舒适区。本文将带你突破常规用法,探索setdefault()在真实项…...

新手怎么部署OpenClaw?2026年本地1分钟超速搭建OpenClaw及大模型百炼APIKey配置

新手怎么部署OpenClaw?2026年本地1分钟超速搭建OpenClaw及大模型百炼APIKey配置。OpenClaw(原Clawdbot)作为2026年主流的AI自动化助理平台,可通过阿里云轻量服务器实现724小时稳定运行,并快速接入钉钉,让AI…...

新手怎么安装OpenClaw?2026年新手10分钟部署OpenClaw及百炼APIKey配置指南

新手怎么安装OpenClaw?2026年新手10分钟部署OpenClaw及百炼APIKey配置指南。OpenClaw(原Clawdbot)作为2026年主流的AI自动化助理平台,可通过阿里云轻量服务器实现724小时稳定运行,并快速接入钉钉,让AI在企业…...

从引脚定义到PCB布线:硬件工程师的SATA接口设计避坑指南(附信号完整性实测)

从引脚定义到PCB布线:硬件工程师的SATA接口设计避坑指南(附信号完整性实测) 在当今数据驱动的硬件设计中,SATA接口依然是存储设备连接的中坚力量。作为一名经历过无数次深夜调试的硬件工程师,我深知一个看似简单的SATA…...

Linux依赖冲突实战:deepin-wine疑难杂症排查指南

1. 当deepin-wine遇上依赖地狱:报错现场还原 第一次在Ubuntu上安装deepin-wine时,那个满屏飘红的依赖错误让我至今记忆犹新。终端里不断刷新的"但是它将不会被安装"提示,像极了游戏里的连环陷阱。这类问题通常发生在混合安装32位/6…...

AGX Orin 部署PyTorch生态:从JetPack适配到torchvision编译避坑指南

1. AGX Orin开发环境初始化 刚拿到AGX Orin开发套件时,很多开发者会直接开始安装PyTorch,但往往忽略了基础环境配置的重要性。我去年在部署一个工业质检项目时就踩过这个坑——当时为了赶进度跳过了JetPack版本检查,结果导致后续torchvision编…...

为什么芯片工程师都在学Chisel?从Verilog到高级硬件设计的跃迁指南

为什么芯片工程师都在学Chisel?从Verilog到高级硬件设计的跃迁指南 在半导体行业,设计效率正成为决定产品成败的关键因素。传统Verilog开发中,工程师们常常需要花费70%的时间调试RTL代码中的低级错误,而非专注于架构创新。这种现状…...

ESP32自动登录校园网实战:绕过网页认证,实现设备永久在线(附完整Arduino代码)

ESP32校园网自动登录全攻略:从逆向分析到模块化封装 校园网环境下的IoT设备部署常面临一个棘手问题——每次断电重启后都需要手动登录网页认证系统。想象一下凌晨三点实验室的温湿度监测系统突然掉线,而你不得不顶着寒风跑去教学楼重新登录的场景。本文将…...

Multisim中在一个项目中添加多页

Multisim中在一个项目中添加多页 新建多页 新建支电路 参考 Multisim电路模块化设计的三种方式_multisim模块封装-CSDN博客 Multisim创建子电路图-百度经验...

Multisim仿真固定偏置电路

Multisim仿真固定偏置电路 Multisim软件版本 依次点击帮助→关于 NI Multisim 14.0 Multisim Power Pro Edition Multisim中绘制电路图 元器件 电源VCC VCCNPN晶体管 BJT_NPN 2N2222A偏置电阻RB Resistor集电极电RC Resistor接地GND DGND 仿真 万用表测量电压结果 电流测…...

IDM激活开源工具:永久使用Internet Download Manager的完整指南

IDM激活开源工具:永久使用Internet Download Manager的完整指南 【免费下载链接】IDM-Activation-Script IDM Activation & Trail Reset Script 项目地址: https://gitcode.com/gh_mirrors/id/IDM-Activation-Script 当你发现下载工具突然停用&#xff0…...

3步解锁群晖Photos人脸识别:让DS918+等设备重获AI能力

3步解锁群晖Photos人脸识别:让DS918等设备重获AI能力 【免费下载链接】Synology_Photos_Face_Patch Synology Photos Facial Recognition Patch 项目地址: https://gitcode.com/gh_mirrors/sy/Synology_Photos_Face_Patch 还在为群晖DS918、DS3615xs等设备无…...

解决RDK X5(ARM64架构)板卡Remote-SSH运行Antigravity AI崩溃(SIGILL):Samba网络盘本地挂载方案

一、前言最近在折腾 D-Robotics 的 RDK X5 板卡(搭载 Sunrise X5 芯片,ARM Cortex-A55 架构)。在尝试使用强大的 Antigravity IDE 通过 Remote-SSH 远程连接板卡进行开发时,遇到了一个极其头疼的问题:AI 侧边栏完全不可…...

C++资源控制哲学:从push_back与emplace_back看左值右值

一、从问题开始std::vector<Person> people; Person bob("bob", 22);people.push_back(bob); // 左值 people.push_back(Person("alice", 25)); // 右值 people.emplace_back("charlie", 30); // 直接构造为什么需要这么多插入…...

OpenClaw、Agent、Skill、MCP 深度解读与区分分析

引言&#xff1a;AI从"对话"到"行动"的范式转移在人工智能的发展历程中&#xff0c;我们正经历一场深刻的范式转移。传统的AI工具&#xff08;如早期ChatGPT&#xff09;主要扮演"建议者"角色&#xff0c;能生成文本、提供建议&#xff0c;但无法…...

WorkBuddy 实用培训课程内容体系:从入门到精通的“数字员工”养成指南

构建的 WorkBuddy&#xff08;基于OpenClaw架构&#xff09;实用培训课程内容体系。本体系深度解构了OpenClaw的技术原理、生态应用与安全实践&#xff0c;旨在培养具备专业能力的“数字员工”管理者与开发者。课程前言&#xff1a;AI 范式转移——从“建议者”到“执行者”在人…...

APM基础概念普及:应用性能管理的全面解析

在当今数字化时代&#xff0c;企业应用的性能直接影响着用户体验和商业成功。应用性能管理&#xff08;Application Performance Management&#xff0c;APM&#xff09;作为保障应用稳定运行的关键技术&#xff0c;已成为现代IT运维不可或缺的工具。本文将全面解析APM的基础概…...

夸克网盘自动化助手:彻底告别手动转存的智能管理方案

夸克网盘自动化助手&#xff1a;彻底告别手动转存的智能管理方案 【免费下载链接】quark_auto_save 夸克网盘签到、自动转存、命名整理、发推送提醒和刷新媒体库一条龙 项目地址: https://gitcode.com/gh_mirrors/qu/quark_auto_save 还在为每天重复的夸克网盘转存操作而…...

解锁Intel GPU的CUDA能力:从零开始的跨硬件计算实践

解锁Intel GPU的CUDA能力&#xff1a;从零开始的跨硬件计算实践 【免费下载链接】ZLUDA CUDA on non-NVIDIA GPUs 项目地址: https://gitcode.com/GitHub_Trending/zl/ZLUDA 当实验室电脑只有Intel集成显卡却需要运行CUDA加速程序时&#xff0c;当笔记本的Iris Xe显卡面…...

入门首选:8bit逐次逼近型SAR ADC电路设计成品,基于SMIC 0.18工艺,3.3V供...

8bit逐次逼近型SAR ADC电路设计成品 入门时期的第三款sarADC&#xff0c;适合新手学习等。 包括电路文件和详细设计文档。 smic0.18工艺&#xff0c;单端结构&#xff0c;3.3V供电。 整体采样率500k&#xff0c;可实现基本的模数转换&#xff0c;未做动态仿真&#xff0c;文档内…...

脉冲注入法与电感法无刷电机BLDC控制器方案

脉冲注入法&#xff0c;持续注入&#xff0c;启动低速运行过程中注入&#xff0c;电感法&#xff0c;ipd&#xff0c;力矩保持&#xff0c;无霍尔无感方案&#xff0c;媲美有霍尔效果。 bldc控制器方案&#xff0c;无刷电机。 提供源码&#xff0c;原理图。一、文档引言 本文基…...

基于注意力机制的多尺度卷积神经网络在滚动轴承故障诊断中的应用

基于注意力的多尺度卷积神经网络轴承故障诊断 针对传统方法在噪声环境下诊断精度低的问题&#xff0c;提出了一种多尺度卷积神经网络的滚动轴承故障诊断方法 首先&#xff0c;构建多尺度卷积提取不同尺度的故障特征&#xff0c;同时引入通道注意力自适应地选择包含故障特征的通…...

无人船编队 无人车编队 MPC 模型预测控制 多智能体协同控制 一致性 MATLAB 无人车 USV

无人船编队 无人车编队 MPC 模型预测控制 多智能体协同控制 一致性 MATLAB 无人车 USV 带原文献一、代码核心定位与应用场景 本套MATLAB源码针对自主水下航行器&#xff08;AUV&#xff09;、无人船&#xff08;USV&#xff09;、无人车等多智能体系统&#xff0c;实现了基于事…...

MDIN380芯片高清视频处理方案:SDI转VGA与LVDS转换,专业PCB设计与源码集成

MDIN380 SDI转VGA 转LVDS VGA转SDI 高清视频处理 MDIN380芯片 PCB代码方案资料 3G-SDI转VGA ?3G-SDI转LVDS ?高清视频 MDIN380、GV7601 芯片方案(PCB图和源码)。 此方案是韩国视频处理芯片MDIN380的整合应用方案。 3G-SDI转VGA或3G-SDI转LVDS。 方案共有两块电路板(一块底板…...

字符串题目

字符串输入char s[10];fgets(s,10,stdin);int lenstrlen(s);if(s[len-1]\n){s[len-1]0;}len--;拼数#include <stdio.h> #include <string.h>#define MAX 100005char res[MAX][20]; int n;int cmp(const void *a,const void *b) {char *pa(char*)a;char *pb(char*)b…...

如何快速掌握DownKyi:从新手到专家的完整视频下载指南

如何快速掌握DownKyi&#xff1a;从新手到专家的完整视频下载指南 【免费下载链接】downkyi 哔哩下载姬downkyi&#xff0c;哔哩哔哩网站视频下载工具&#xff0c;支持批量下载&#xff0c;支持8K、HDR、杜比视界&#xff0c;提供工具箱&#xff08;音视频提取、去水印等&#…...