FASTAPI第二天
FastAPI入门以及代码进化一、什么是ORM1.1ORM的概念以及优势二、环境搭建和FastAPI集成2.1 安装依赖2.2 与MYSQL的使用2.3项目结构搭建2.4数据库配置文件三、增删改查的实现3.1查找3.2增加3.3修改3.4删除1.1.1ORM全称为Object-Relational Mapping对象关系映射、它的核心思想是用pychon类来代表数据库中的表1.1.2ORM 的优势面向对象用 Python 代码替代 SQL 语句更符合编程思维。安全性自动进行参数化查询防止 SQL 注入攻击。跨数据库同一套代码可以无缝切换 SQLite、PostgreSQL、MySQL 等数据库。关系管理自动处理表与表之间的外键、多对多等关系。可维护性表结构集中定义在模型类中修改和管理更方便。二、环境搭建和FastAPI集成2.1 安装依赖要使用 Tortoise-ORM 与 FastAPI 集成需要安装以下依赖# 安装 Tortoise-ORM 核心库pipinstalltortoise-orm# MySQL 异步驱动推荐 asyncmypipinstallasyncmy# 或者使用 aiomysql# pip install aiomysql# 安装 Aerich 迁移工具用于数据库迁移pipinstallaerich# 安装 FastAPI 和 Uvicornpipinstallfastapiuvicorn[standard]依赖说明tortoise-orm: 异步 ORM 核心库提供模型定义、查询等 ORM 功能asyncmy: 高性能 MySQL 异步驱动推荐aiomysql: 另一个 MySQL 异步驱动备选aerich: Tortoise-ORM 的数据库迁移工具fastapi: 现代、快速的 Web 框架uvicorn: ASGI 服务器用于运行 FastAPI 应用验证安装安装完成后可以创建一个简单的 Python 文件验证依赖是否安装成功# test_install.pyimporttortoiseimportasyncmyimportaerichimportfastapiimportuvicornprint(Tortoise-ORM version:,tortoise.__version__)print(FastAPI version:,fastapi.__version__)print(Uvicorn version:,uvicorn.__version__)print(所有依赖安装成功)运行验证脚本python test_install.py如果一切正常将看到各个库的版本信息输出。三、增删改查的实现3.1 查找常用方法包括await Model.all()查询全部记录。await Model.filter(...)按条件过滤。await Model.get_or_none(...)按条件查询单条查不到返回None避免抛异常。await Model.filter(...).count()统计数量。await Model.all().order_by(-priority)按字段排序-表示倒序。示例获取所有任务并统计状态task_api.get(/all,summary获取所有任务信息,description获取所有任务信息)asyncdefgetAllTask():tasks1awaitTasks.all().order_by(-priority)count1awaitTasks.filter(status1).count()count0awaitTasks.filter(status0).count()count2awaitTasks.filter(status2).count()return{code:1,message:success,data:{任务列表:tasks1,总任务数量:len(tasks1),待办数量:count0,进行中数量:count1,已完成数量:count2}}这里的Tasks.all()会返回全部任务order_by(-priority)表示按优先级从高到低排序filter(status0).count()则统计不同状态的任务数量。示例按 ID 查找单条任务task_api.get(/today_count,summary今日到期任务数量,description统计今日到期且未完成的任务数量)asyncdeftoday_count():todaydatetime.now().replace(hour0,minute0,second0,microsecond0)tomorrowtodaytimedelta(days1)countawaitTasks.filter(due_date__gtetoday,due_date__lttomorrow,status__in[0,1]).count()return{code:1,message:success,data:count}filter(due_date__gtetoday, due_date__lttomorrow, status__in[0,1])展示了条件查询__gte大于等于greater than or equal。__lt小于less than。__in字段值在列表中。示例获取所有用户user_api.get(/all,summary获取所有用户信息,description获取所有用户信息)asyncdefgetAllUser():users1awaitUser.all()return{code:1,message:success,data:users1}3.2 增加新增数据有两种常见方式await Model.create(**kwargs)直接创建并保存到数据库返回模型实例。model Model(**kwargs); await model.save()先实例化再手动保存。示例创建任务task_api.post(/add,summary添加任务,description添加任务)asyncdefadd(task:TaskAdd):datatask.model_dump()ifhasattr(task,model_dump)elsedict(task)data[user_id]data.pop(user)task1awaitTasks.create(**data)return{code:1,message:添加成功,data:task1}这里TaskAdd是 Pydantic 请求模型。由于Tasks表中的外键字段名是user_id但前端传入的是user所以通过data[user_id] data.pop(user)做了一个字段映射。最后调用Tasks.create(**data)完成插入。示例创建用户user_api.post(/add,summary添加用户,description添加用户)asyncdefgetadd(user:UseraddRequest):user2User(**dict(user))awaituser2.save()return{code:1,message:添加成功,data:user2}这里先用User(**dict(user))实例化模型对象再调用await user2.save()保存到数据库。两种方式效果相同选择哪种主要看个人习惯。3.3 修改修改流程通常是先用get_or_none查出目标记录。判断记录是否存在不存在则返回提示。修改对应字段。调用await model.save()保存。示例更新任务信息task_api.put(/update/{id},summary更新任务信息,description更新任务信息)asyncdefedit(task:TaskEdit,id:int):task3awaitTasks.get_or_none(idid)iftask3isNone:return{code:0,message:任务不存在,data:None}task3.usertask.user task3.titletask.title task3.descriptiontask.description task3.statustask.status task3.prioritytask.priority task3.due_datetask.due_date task3.complete_datetask.complete_dateawaittask3.save()return{code:1,message:更新成功,data:task3}示例更新任务状态task_api.put(/{id}/status,summary切换任务状态,description切换到已完成时自动记录完成时间切回其他状态时清空完成时间)asyncdefupdate_status(id:int,status:int):taskawaitTasks.get_or_none(idid)iftaskisNone:return{code:0,message:任务不存在,data:None}task.statusstatusifstatus2:task.complete_datedatetime.now()else:task.complete_dateNoneawaittask.save()return{code:1,message:状态切换成功,data:task}update_status里除了修改状态还根据业务规则自动处理complete_date切换到已完成时记录当前时间切回其他状态时清空完成时间。示例更新用户信息user_api.put(/update/{id},summary更新用户信息,description更新用户信息)asyncdefedit(user:UserEditRequest,id:int):user3awaitUser.get_or_none(idid)ifuser3isNone:return{code:0,message:用户不存在,data:None}user3.usernameuser.username user3.emailuser.email user3.phoneuser.phone user3.is_activeuser.is_activeawaituser3.save()return{code:1,message:更新成功,data:user3}3.4 删除删除流程与修改类似先查到对象再调用await model.delete()。示例删除任务task_api.delete(/delete/{id},summary删除任务,description删除任务)asyncdefdelete(id:int):task4awaitTasks.get_or_none(idid)awaittask4.delete()return{code:1,message:删除成功,data:None}示例删除用户user_api.delete(/delete/{id},summary删除用户,description删除用户)asyncdefdelete(id:int):user4awaitUser.get_or_none(idid)awaituser4.delete()return{code:1,message:删除成功,data:None}小结通过上面的代码可以看到Tortoise-ORM 下的 CRUD 操作非常接近自然语言查all()、filter()、get_or_none()、count()增create()或save()改查出来 → 改字段 →save()删查出来 →delete()所有操作都别忘了加await因为 Tortoise-ORM 是原生异步的。另外真实的业务代码里通常会做空值判断if task is None和字段映射如user_id与user以保证接口健壮性。

相关新闻

sherpa-onnx:下一代Kaldi语音AI的12种编程语言跨平台革命

sherpa-onnx:下一代Kaldi语音AI的12种编程语言跨平台革命

sherpa-onnx:下一代Kaldi语音AI的12种编程语言跨平台革命 【免费下载链接】sherpa-onnx Speech-to-text, text-to-speech, speaker diarization, speech enhancement, source separation, and VAD using next-gen Kaldi with onnxruntime without Internet connecti…

2026/10/20 19:41:25 阅读更多 →
Agent Memory:分层管理让AI更智能,小白也能轻松掌握大模型核心!

Agent Memory:分层管理让AI更智能,小白也能轻松掌握大模型核心!

Agent Memory是AI Agent的“工作记忆系统”,它通过分层管理(用户偏好、任务状态、事实知识、操作痕迹)实现信息的有效存储、检索、更新和遗忘,帮助Agent可靠地跨轮次、跨工具、跨天工作。设计Memory的关键在于合理分层&#xff0c…

2026/10/17 17:12:11 阅读更多 →
plpgsql_check 实战:5个常见PL/pgSQL错误检测与修复案例

plpgsql_check 实战:5个常见PL/pgSQL错误检测与修复案例

plpgsql_check 实战:5个常见PL/pgSQL错误检测与修复案例 【免费下载链接】plpgsql_check plpgsql_check is a linter tool (does source code static analyze) for the PostgreSQL language plpgsql (the native language for PostgreSQL store procedures). 项目…

2026/10/19 19:42:02 阅读更多 →

最新新闻

Django生产级博客骨架源码:零配置启动+可部署结构

Django生产级博客骨架源码:零配置启动+可部署结构

简介:这是一套基于Django框架从零开始构建的个人博客网站完整源码,面向Python后端初学者与Web开发入门者,帮助学习者系统掌握Django项目结构、ORM建模、模板渲染、静态资源管理及基础部署流程。压缩包共421个文件,涵盖26个核心Pyt…

2026/10/20 19:41:21 阅读更多 →
PyTorch项目实战:从零搭建图像分类的避坑指南

PyTorch项目实战:从零搭建图像分类的避坑指南

1. 从零手搓一个PyTorch项目:一个老手的踩坑与实战笔记搞深度学习这几年,PyTorch几乎成了我每天都要打交道的工具。但说实话,真正让我头疼的从来不是写模型结构本身,而是从环境配置到训练调优这一整条链路上那些琐碎又致命的细节。…

2026/10/20 19:41:21 阅读更多 →
多虚拟电厂主从博弈与ACPSO-EI-Kriging及APVP-MHA-MTL预测框架全解析

多虚拟电厂主从博弈与ACPSO-EI-Kriging及APVP-MHA-MTL预测框架全解析

先说结论:这个标题的含金量主要在“组合方式”,而不是单点技术。ACPSO、EI、Kriging、主从博弈、APVP、MHA、MTL,每一个单拎出来都有大量现成资料,但把它们按“上层优化下层代理博弈交互”和“多任务注意力共享表征预测”两条线组…

2026/10/20 19:41:21 阅读更多 →
改进DINO-4scale模型实现棉田作物生长监测与目标检测

改进DINO-4scale模型实现棉田作物生长监测与目标检测

棉田生长监测这件事,做农业视觉的人应该深有体会:无人机拍回来的正射影像分辨率很高,但地面棉株一进入封行期,棉铃、棉蕾全被叶片盖住,人工看图数起来又慢又晕。更麻烦的是,棉田目标天生就“小、密、遮挡多…

2026/10/20 19:41:21 阅读更多 →
降AI率实操指南:6类免费工具与人工精修方法

降AI率实操指南:6类免费工具与人工精修方法

每年四五月份,总有学弟学妹半夜给我发消息,上来就问:“论文AI率80%多,学校查重前要求降到10%以下,怎么办?”说实话,这个问题我自己当年也撞上过,被检测报告上的高百分比吓得连夜改稿…

2026/10/20 19:41:21 阅读更多 →
WebSocket消息推送实战:从轮询到高并发长连接的全流程拆解

WebSocket消息推送实战:从轮询到高并发长连接的全流程拆解

接手过一个实时通知服务,业务上要求订单状态变更、客服会话、后台告警都要在秒级内推到用户端。最开始图省事用HTTP轮询,连接一多业务一复杂就明显顶不住——服务端压力大、客户端拿到的数据也不是实时的,高峰时段光无效请求就能把接口拖垮。…

2026/10/20 19:40:18 阅读更多 →

日新闻

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
ESP32舵机控制指南:原理、多路驱动与避坑实战

ESP32舵机控制指南:原理、多路驱动与避坑实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
位移法实现一阶低通滤波:单片机ADC采样降噪实战

位移法实现一阶低通滤波:单片机ADC采样降噪实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/20 10:02:13 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/19 17:32:41 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 10:02:08 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:45 阅读更多 →