TortoiseORM 与 SQLAlchemy 深度对比

TortoiseORM 与 SQLAlchemy 是 Python 两大 ORM 路线:异步优先简洁派 vs 功能深厚全能派。本文从模型定义、查询构建、关系、迁移、类型支持与原生 SQL 全面对比。

最佳实践
数据整理与查询插画

直接回答:SQLAlchemy 是 提供 Core 与 ORM 两层接口的数据库工具,同步异步都支持,适合需要精细数据库控制的复杂应用;TortoiseORM 异步优先、Django 风格 API、样板代码极少,为现代高并发 API 而生。 选型看两点:并发模型与复杂度需求。

快速对比

维度 SQLAlchemy TortoiseORM
设计 全能工具箱(Core+ORM 两层) 异步优先、Django 风
异步 1.4 起提供 asyncio 扩展,2.x 继续支持 AsyncSession 原生 asyncio,处处 await
学习曲线 陡 平缓
迁移 Alembic(成熟强大) 1.x 推荐内置迁移,Aerich 为历史替代路径
生态 极厚 年轻

模型定义

以下两套片段分别放在各自项目中,Base、Author、数据库初始化和会话由项目提供;不要把两个同名 Book 类连续定义后混用。

# SQLAlchemy 2.0
class Book(Base):
    __tablename__ = "books"
    id: Mapped[int] = mapped_column(primary_key=True)
    title: Mapped[str]
    author_id: Mapped[int] = mapped_column(ForeignKey("authors.id"))

# TortoiseORM
class Book(Model):
    id = fields.IntField(primary_key=True)
    title = fields.CharField(max_length=200)
    author = fields.ForeignKeyField("models.Author", related_name="books")

Tortoise 的声明更轻(无 Mapped 注解仪式);SQLAlchemy 2.0 的注解改善静态类型推断——风格简洁 vs 类型严格的分歧从定义就开始了。

查询构建

# SQLAlchemy:显式 select 表达式
stmt = select(Book).where(Book.title.contains("时代")).order_by(Book.id.desc())
books = session.scalars(stmt).all()

# Tortoise:Django 式链式 API
books = await Book.filter(title__contains="时代").order_by("-id")

简单查询 Tortoise 更顺手;复杂查询(多层 JOIN、子查询、窗口函数)SQLAlchemy 的 Core 层提供更细粒度的构造方式——Core 层甚至能当 SQL 构造器用。

关系处理

两者都有预加载解决 N+1:SQLAlchemy 的 selectinload/joinedload(策略精细可调),Tortoise 的 prefetch_related/select_related(语义直白)。策略深度 SQLAlchemy 胜,日常够用两家都够。

迁移支持

Alembic 是 SQLAlchemy 的王牌:自动侦测模型变更生成迁移、离线/在线模式、分支合并——企业级成熟度。当前 Tortoise 1.x 官方推荐内置迁移,并提供 RunPython、RunSQL 数据迁移能力;Aerich 属于历史替代路径。复杂 DDL、回滚及多数据库支持需逐项核对和验证,不能沿用旧版本的功能比较。

类型与校验

SQLAlchemy 2.0 的 Mapped[] 注解让 Mypy 能验证查询类型;Tortoise 类型支持在改善但深度不及。需要 Pydantic 校验联动时,SQLModel(SQLAlchemy 之上)是成熟路径。

原生 SQL

SQLAlchemy 的 Core 表达式是"结构化 SQL"的巅峰;实在不行 text() 直接写。Tortoise 也支持 raw SQL,但定位是逃生舱而非日常工具。需要大量手写 SQL 时可比较 SQLAlchemy Core 与数据库原生驱动,并结合参数化、事务和可维护性选择。

测试支持

SQLAlchemy 的会话可绑外部事务实现"测试后回滚"的极速隔离;Tortoise 自带测试初始化器(initializer/finalizer)快速搭拆库。两家都能写出快而稳的数据库测试。

决策表

场景 选
FastAPI/异步框架 + 常规 CRUD TortoiseORM(或 SQLModel)
复杂查询、报表、数据密集型系统 SQLAlchemy
需要更细的类型表达与映射控制 SQLAlchemy 2.0
团队 Django 背景、求快速上手 TortoiseORM

常见问题(FAQ)

Q:Tortoise 的性能比 SQLAlchemy 异步好吗?
A:没有通用胜负结论;需控制数据库、驱动、SQL、加载策略、连接池及并发方式后比较,不能预先断言框架开销可忽略。

Q:能从 Tortoise 迁到 SQLAlchemy 吗(或反向)?
A:模型与查询都要重写,成本不小。前期选型值得花一天做原型对比,胜过后期迁移。

Q:两者能混用吗?
A:技术上能(连同一个库),但两套连接池、两套会话语义并存是维护噩梦。选定一家。

官方参考

本文基于官方文档整理,未进行运行时或性能测试。示例中的业务函数、数据模型和部署地址需结合项目补全;局部片段不等同于完整生产应用。

延伸阅读

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台