如何选择后Django时代SQLAlchemy 2.0、Tortoise与Piccolo三大异步ORM?
摘要:前言 从 Django 的避风港走向异步星辰大海 ——题记 最近的空闲时间,我折腾了 TechDistill 项目,可以看到近期的公众号推送都是「AI科技日报」,这就是 TechDistill 项目的产物,在每天快速迭代的各类技术新闻中,开
前言
从 Django 的避风港走向异步星辰大海
——题记
最近的空闲时间,我折腾了 TechDistill 项目,可以看到近期的公众号推送都是「AI科技日报」,这就是 TechDistill 项目的产物,在每天快速迭代的各类技术新闻中,开发者和技术爱好者往往会面临严重的信息过载。TechDistill 通过聚合多个高质量的技术信息源,并利用 LLM(大型语言模型)进行深度的整理与总结,从而大幅降低用户筛选和阅读的心智负担。
也是在开发新东西的时候,我觉得传统的 Django 方案太重了,FastAPI 的方案虽然简单易用,但我不喜欢这种散装的工具,给人一种混乱、无秩序的感觉,这时候我想起来之前写文章分享过的 LiteStar…
作为一名在 Django 生态浸淫多年的开发者,我一直对 Django 那套全家桶方案心存敬畏:稳定、完善,几乎定义了 Python Web 开发的标准。但随着 Web 迈入异步(Async)时代,尤其是当最近深度体验了 LiteStar 这种追求极致架构与性能的框架后,我意识到是时候在一些 AI 相关的新项目上使用 LiteStar 了,而跳出 Django 生态意味着告别成熟好用的 Django ORM
在现代异步 Web 开发中,ORM(对象关系映射)的选型不再是随框架赠送,而是一场关乎代码整洁度、类型安全和工程上限的深度博弈。
今天,我们就来聊聊目前 Python 异步生态中具有代表性的三个选择:SQLAlchemy 2.0、Tortoise ORM 和 Piccolo。
参赛选手
SQLAlchemy 2.0:数据库界的工业母机
如果说 Python 数据库领域有一座神庙,那供奉的一定是 SQLAlchemy。在经历了漫长的 1.x 时代后,2.0 版本的发布标志着它正式拥抱了强类型标注和原生异步。
SQLAlchemy 在 GitHub 上拥有 11.7k stars,是 python 生态里 ORM 的第一选择。
核心哲学: Data Mapper(数据映射模式)。它将内存中的对象与数据库表结构解耦,给予开发者极高的操作精度。
杀手锏: 无敌的生态与 Alembic 迁移工具。
槽点: 学习曲线最陡峭,配置略显繁琐。
Tortoise ORM:Django 老玩家的温柔乡
如果你习惯了 Django 那套 Model.objects.filter() 的写法,Tortoise 会让你感到前所未有的亲切。
这个项目到现在也发展了很长时间了,在 GitHub 上有 5.5k+ stars,算是成熟的项目了。
核心哲学: Active Record(领域模型模式)。模型本身即包含了数据操作逻辑。
杀手锏: 零学习成本(针对 Django 用户)。
槽点: 灵活性受限,在大规模复杂查询下显得有些吃力。
Piccolo:来自未来的 Prisma 挑战者
这是一个 GitHub Stars 不算多(约 1.9k),但设计极其惊艳的小众精品。
有点像 TypeScript 生态的 Prisma 和 drizzle 那种感觉。
核心哲学: 现代、轻量、类型安全优先。
杀手锏: 极具现代感的链式语法和自带的 Piccolo Admin。
槽点: 社区生态较小,在生产环境遇到 Bug 时可能需要孤军奋战。
直接上代码
为了直观对比,我们设计一个经典的场景:用户(User)与文章(Post)的一对多关联查询。
建模对比
SQLAlchemy 2.0 强制要求类型标注,对 IDE 极其友好:
class User(Base):
__tablename__ = "user"
id: Mapped[int] = mapped_column(primary_key=True)
name: Mapped[str] = mapped_column(String(30))
posts: Mapped[list["Post"]] = relationship(back_populates="user")
Tortoise 则是熟悉的味道,几乎 1:1 还原 Django 模型写法。
class User(Model):
id = fields.IntField(pk=True)
name = fields.CharField(max_length=30)
Piccolo 简洁到了极致,为异步和类型安全而生,语法非常现代。
