FastAPI 接入异步 PostgreSQL 完成任务 CRUD 与数据库迁移
内存列表写起来很轻松服务一重启昨天创建的任务就像没发生过。真正麻烦的还不只是丢数据多个请求同时改一条任务时列表也没有事务可言。这一篇把第一篇的接口换成 PostgreSQL并让迁移脚本替我们记录表结构的变化。配套代码已经放在 fastapi-task-api文章中的完整实现以main分支为准。让数据库连接成为配置数据库地址不能散落在路由里。开发机、测试环境和 Docker 容器的主机名都不同把它收进配置模型部署时只需要替换环境变量。frompydantic_settingsimportBaseSettings,SettingsConfigDictclassSettings(BaseSettings):database_url:strpostgresqlasyncpg://task_api:task_apilocalhost:5432/task_apimodel_configSettingsConfigDict(env_file.env)项目使用 SQLAlchemy 2 的异步引擎和asyncpg驱动。异步不是让每条 SQL 更快它让等待数据库返回的时间可以让给别的请求。fromsqlalchemy.ext.asyncioimportAsyncSession,async_sessionmaker,create_async_engine enginecreate_async_engine(settings.database_url,pool_pre_pingTrue)SessionLocalasync_sessionmaker(engine,expire_on_commitFalse,class_AsyncSession)asyncdefget_session():asyncwithSessionLocal()assession:yieldsession# 一个请求拿到一个会话pool_pre_pingTrue会在复用连接前检查连接是否还活着。数据库重启后直接复用旧连接是线上很常见的一类偶发错误。模型描述表Schema 描述接口ORM 模型和 Pydantic 模型看起来字段相似职责却不同。前者描述表、外键和索引后者描述接口允许传入或返回什么。把两者硬合在一个类里起步很快后面加密码字段或内部状态时就会开始泄漏。importuuidfromenumimportStrEnumfromsqlalchemyimportEnum,ForeignKey,Stringfromsqlalchemy.ormimportMapped,mapped_columnclassTaskStatus(StrEnum):TODOtodoIN_PROGRESSin_progressDONEdoneclassTask(Base):__tablename__tasksid:Mapped[uuid.UUID]mapped_column(primary_keyTrue,defaultuuid.uuid4)title:Mapped[str]mapped_column(String(200))status:Mapped[TaskStatus]mapped_column(Enum(TaskStatus),defaultTaskStatus.TODO)owner_id:Mapped[uuid.UUID]mapped_column(ForeignKey(users.id),indexTrue)这里已经预留了owner_id。第三篇才会引入用户认证但表结构早点确定迁移就不会反复推倒重来。一次查询如何穿过依赖注入路由不应该自己创建连接。Depends把会话传进函数框架在请求结束后关闭它。回到任务列表这块分页和状态筛选仍然是第一篇的接口只是实现从切片换成 SQL。fromsqlalchemyimportfunc,selectrouter.get(,response_modelTaskList)asyncdeflist_tasks(skip:intQuery(0,ge0),limit:intQuery(20,ge1,le100),task_status:TaskStatus|NoneQuery(None,aliasstatus),session:AsyncSessionDepends(get_session),)-TaskList:conditionTask.owner_idcurrent_user.idiftask_statusisnotNone:conditioncondition(Task.statustask_status)totalawaitsession.scalar(select(func.count()).select_from(Task).where(condition))rowsawaitsession.scalars(select(Task).where(condition).offset(skip).limit(limit))returnTaskList(itemslist(rows),totaltotalor0)查询列表和统计总数是两条 SQL这在多数后台页面足够清楚。数据量很大时再改用游标分页不要为了一个十条数据的任务清单提前造复杂方案。迁移不是可有可无的脚本直接create_all()在本地很方便团队协作就会变得危险。谁在什么时候加了列没有可追溯记录。Alembic 把每次 schema 变更写成版本文件发布时按顺序执行。uv add alembic asyncpg sqlalchemy uv run alembic revision--autogenerate-mcreate users and tasksuv run alembic upgrade head本项目的首个迁移创建users和tasks两张表并为邮箱和任务所有者建立索引。自动生成的迁移也要人工审一遍特别是删除列、枚举变化和大表加索引。工具只知道模型变了不知道线上数据值不值得保留。修改 ORM 模型生成迁移检查 SQL提交版本库部署执行 upgrade常见卡点await少写一个SQLAlchemy 往往不会立刻报出最直观的错误。session.execute、session.commit、session.refresh都是异步边界。另一个坑是把 ORM 对象原样返回建议在响应模型上开启from_attributesTrue由 Pydantic 只挑选公开字段。还有一点经常被忽略commit后数据库生成的id和时间戳不会自动回到 Python 对象。创建接口里要await session.refresh(task)否则响应有机会缺字段。数据库接入完成后任务终于能活过一次重启。但谁能读和改哪条任务还没有答案。下一篇把owner_id接到真实用户上再用测试把这些规则固定下来。本篇收口异步会话通过依赖注入按请求创建和释放ORM 管表结构Pydantic 管接口边界列表查询同时返回数据和总数支持分页与状态筛选Alembic 让 schema 变化有版本、可审查、可部署

相关新闻

FastAPI 写出第一个任务 API 路由、参数校验与自动文档

FastAPI 写出第一个任务 API 路由、参数校验与自动文档

下午临时接到一个需求,产品只留下一句话,做一个能新增、查看和完成任务的接口。要是从路由、校验、接口文档全都手写,半天大概就没了。FastAPI 有意思的地方在于,Python 类型标注已经把这些信息写了一半。 配套代码已经放在 fast…

2026/8/8 0:05:12 阅读更多 →
UE5 GAS实战:GameplayEffect实现RPG药水效果(治疗、回蓝、Buff)

UE5 GAS实战:GameplayEffect实现RPG药水效果(治疗、回蓝、Buff)

1. 项目概述:从一瓶药水开始,理解GAS的核心玩法 在UE5里做RPG,给角色加血加蓝、上Buff,听起来是基础得不能再基础的需求。但当你真正上手,想把一瓶“治疗药水”的效果做扎实时,往往会发现事情没那么简单。是…

2026/8/8 0:05:12 阅读更多 →
昇腾AI代理实现多号通话自动化

昇腾AI代理实现多号通话自动化

基于昇腾(Ascend)硬件与AtomGit AI社区的开源生态,结合AI Agent技术,可以实现一个模拟“通话重复使用机号复制”功能的安卓手机应用原型。其核心是利用AI Agent进行意图理解、任务编排和自动化操作,模拟或管理多号码的…

2026/8/8 0:04:11 阅读更多 →

最新新闻

5G VoNR技术解析:高清语音通话的实现与优化

5G VoNR技术解析:高清语音通话的实现与优化

1. 5G与VoNR技术全景解析当我们在城市里看到越来越多的5G基站时,可能很少有人意识到这些铁塔背后正在发生一场通信技术的革命。作为从业十余年的通信工程师,我见证了从2G到5G的演进过程,而VoNR(Voice over New Radio)无…

2026/8/8 1:09:02 阅读更多 →
PostgreSQL安装配置与基础操作指南

PostgreSQL安装配置与基础操作指南

1. PostgreSQL入门指南:从安装到基础应用PostgreSQL作为一款功能强大的开源关系型数据库系统,已经成为了企业级应用和开发者工具箱中不可或缺的一部分。我最初接触PostgreSQL是在2013年一个电商项目的数据迁移工作中,当时就被它出色的JSON支持…

2026/8/8 1:09:02 阅读更多 →
网络工程师实战入门:从零构建企业网与故障排查方法论

网络工程师实战入门:从零构建企业网与故障排查方法论

最近两年,我身边想转行或者刚入行的朋友,问得最多的问题就是:“网络工程师到底该怎么学?” 他们手里可能有一堆教程,从“零基础”到“实战案例”应有尽有,但真正打开电脑,面对一个模拟的网络拓扑…

2026/8/8 1:09:02 阅读更多 →
go:Prim Algorithms and Kruskal Algorithms

go:Prim Algorithms and Kruskal Algorithms

项目结构:/* # 版权所有 2026 ©涂聚文有限公司™ # 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎 # 描述: Prim Algorithms and Kruskal Algorithms 普里姆算法和克鲁斯卡尔算法 # Author : geovindu,G…

2026/8/8 1:09:02 阅读更多 →
Python: Prim Algorithms and Kruskal Algorithms

Python: Prim Algorithms and Kruskal Algorithms

项目结构:本文展示了一个珠宝供应链物流规划的Python实现,采用领域驱动设计(DDD)架构,包含Prim和Kruskal两种最小生成树算法。系统主要包含:领域模型:LogisticsNode(实体)、LogisticsEdge(值对象)、LogisticsMST(聚合根…

2026/8/8 1:09:02 阅读更多 →
3.2V锂电池,在太阳能产品及消费品的升压芯片应用案例,支持样品测试!

3.2V锂电池,在太阳能产品及消费品的升压芯片应用案例,支持样品测试!

在追求绿色能源与便携供电的今天,磷酸铁锂软包电芯凭借其高安全性、长循环寿命、宽温域适应性以及优异的轻薄形态,已成为户外太阳能产品及诸多消费电子设备的理想电源解决方案。本文将聚焦其在太阳能户外照明领域的核心应用,并深入探讨如何为…

2026/8/8 1:08:02 阅读更多 →

日新闻

AI多智能体时代来临,读懂MCP与A2A架构,抢占企业数字化新风口

AI多智能体时代来临,读懂MCP与A2A架构,抢占企业数字化新风口

当下AI应用飞速普及,无数企业下场搭建智能体系统,可落地阶段难题接踵而至:上下文无限堆积频繁爆栈、AI工具调用准确率低下、Token成本居高不下、企业数据权限混乱暗藏安全隐患……很多团队卡在架构搭建环节,空有前沿技术概念&…

2026/8/8 0:00:07 阅读更多 →
PHP二维码生成终极指南:用chillerlan/php-qrcode打造专业级二维码

PHP二维码生成终极指南:用chillerlan/php-qrcode打造专业级二维码

PHP二维码生成终极指南:用chillerlan/php-qrcode打造专业级二维码 【免费下载链接】php-qrcode A PHP QR Code generator and reader with a user-friendly API. 项目地址: https://gitcode.com/gh_mirrors/ph/php-qrcode 在当今数字时代,二维码已…

2026/8/8 0:00:08 阅读更多 →
UniApp微信小程序隐私保护组件开发:从原理到实战

UniApp微信小程序隐私保护组件开发:从原理到实战

1. 项目缘起:为什么我们需要一个隐私保护通用组件?最近在维护一个基于uniapp开发的微信小程序矩阵时,我遇到了一个非常棘手的问题。随着平台对用户隐私保护的要求越来越严格,几乎每一个新版本发布,或者在某些特定机型&…

2026/8/8 0:00:08 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/6 22:02:27 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/6 22:02:27 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/7 23:24:08 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/7 17:02:37 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/7 23:54:54 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/7 17:02:36 阅读更多 →