如何避免0到1阶段使用FastAPI、PostgreSQL和Tortoise ORM的常见坑?

摘要:本文分享了 FastAPI 搭配 PostgreSQL 使用 Tortoise ORM 的完整实战经验,包括模型设计、数据迁移(aerich)、常见问题及解决方案,帮助你在异步世界中优雅地操作数据库。
你是不是也经历过这种纠结:想用 FastAPI 写个带数据库的项目,却在 SQLAlchemy 和 Tortoise ORM 之间反复横跳? 欢迎新老朋友👋!作为一名在代码堆里摸爬滚打多年的全栈程序媛,今天咱们就聊聊 FastAPI + PostgreSQL + Tortoise ORM 这套组合拳。我会把我自己踩过的坑、修复的数据迁移事故,全都摊开来跟你讲。这不是官方文档的复述,而是一份可以直接拿来用的「避坑实战笔记」。
🎯 本文能帮你解决什么? ✅ 快速搭好 FastAPI + PostgreSQL 的项目骨架 ✅ 搞懂 Tortoise ORM 的模型定义和关系用法(附代码片段) ✅ 用 Aerich 优雅地管理数据库迁移,不再手动改表 ✅ 整合 Jinja2 模板,让 ORM 查询结果直接渲染到前端 ✅ 总结 5 个最容易翻车的坑,附解决方案 📌 主要内容脉络 🔸 为什么要选 Tortoise ORM?——异步世界里的「翻译官」 🔸 环境搭建与配置——别在第一步就摔跤 🔸 模型定义与关系——像搭积木一样建表 - 字段类型避坑指南 - 一对多、多对多实战 🔸 数据迁移 Aerich——数据库的「版本控制」 - 初始化、变更、回滚全流程 🔸 模板渲染——把数据变成页面 🔸 常见问题 & 急救包 ⚙️ 第一部分:为什么是 Tortoise ORM? 你可能会问:FastAPI 官方文档里推荐用 SQLAlchemy 啊,为什么偏要用 Tortoise? 说实话,复杂大型项目还是老老实实配 SQLAlchemy + 异步驱动,它毕竟经过了时间的沉淀,够稳。但对于新手新项目或快速原型来说,就有点像穿着皮鞋跑步——能跑,但别扭。直到我发现了 Tortoise ORM,它简直就是为异步 Python 而生的。你可以把它想象成一个「实时翻译官」,你写 Python 对象,它自动翻译成 SQL,而且全程异步非阻塞,跟 FastAPI 的 async/await 天生一对。 💡 核心优势:类 Django ORM 的语法(上手快)、全异步支持、自带分页和信号,最关键的是——配合 Aerich 做迁移,比 Alembic 在异步环境下的配置简单太多了! 🔧 第二部分:搭建项目骨架(含配置代码) 好,咱们先来搭环境。假设你已经有了 Python 3.8+ 和 PostgreSQL 实例。 # 安装依赖 pip install fastapi uvicorn[standard] tortoise-orm[asyncpg] aerich asyncpg tomlkit jinja2 这里提醒一句:如果你偶尔要跑一些同步脚本,或者用一些依赖 psycopg2 的工具(比如某些数据库管理 GUI),那装个 psycopg2-binary 也无妨。记得用 binary 版本,别给自己找编译的麻烦 😉,千万别学我当初偷懒,直接用 psycopg2 而不是 psycopg2-binary,结果部署到 Linux 上编译报错……用 binary 版本省心很多。
阅读全文