SQLAlchemy 和 Tortoise-ORM 都是 Python 中流行的 ORM(对象关系映射)工具,但它们的设计哲学、适用场景和生态支持有显著差异。下面我将从 核心特性、语法风格、异步支持、生态兼容性、适用场景 等多个维度进行横向对比,并给出明确的选型建议。
📊 一、快速总览对比表
| 特性 | SQLAlchemy | Tortoise-ORM |
|---|---|---|
| 类型 | 功能全面的 SQL 工具包 + ORM | 轻量级 异步 ORM(受 Django ORM 启发) |
| 同步/异步 | ✅ 同步(1.x) ✅ 异步(2.0+,需 async/await) | ✅ 原生异步(仅支持 async) |
| 数据库支持 | 广泛:PostgreSQL, MySQL, SQLite, Oracle, MSSQL 等 | 主流:PostgreSQL, MySQL, SQLite, MariaDB |
| 学习曲线 | 较陡(概念多:Session, Engine, Declarative 等) | 平缓(类似 Django ORM,直观) |
| FastAPI 兼容性 | ✅ 官方推荐(配合 databases 或 SQLAlchemy 2.0 async) | ✅ 天然契合(专为 async 框架设计) |
| 迁移工具 | ✅ Alembic(强大、灵活) | ✅ Aerich(基于 Tortoise,类似 South/Django) |
| 查询语法 | 方法链 + 表达式语言(灵活但略冗长) | Django 风格(.filter().order_by(),简洁) |
| 社区 & 成熟度 | ⭐⭐⭐⭐⭐(2005 年发布,工业级稳定) | ⭐⭐⭐(2019 年起,较新但活跃) |
| 适合项目 | 大型系统、复杂查询、企业级应用 | FastAPI / Starlette 异步项目、中小型 API |
🔍 二、详细对比分析
1️⃣ 异步支持(关键区别!)
✅ SQLAlchemy(2.0+)
- 从 2.0 版本开始正式支持异步(使用
asyncio) - 需要显式使用
AsyncSession和async with 示例:
from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession from sqlalchemy.orm import sessionmaker engine = create_async_engine("postgresql+asyncpg://...") async_session = sessionmaker(engine, class_=AsyncSession) async def get_user(user_id): async with async_session() as session: return await session.get(User, user_id)
✅ Tortoise-ORM
- 从设计之初就是异步的,API 更简洁
示例:
from tortoise.models import Model from tortoise import fields class User(Model): id = fields.IntField(pk=True) name = fields.CharField(max_length=50) # 查询 user = await User.get(id=1) users = await User.filter(name__icontains="alice").all()
💡 结论:
- 如果你用 FastAPI + 异步,且希望代码简洁 → Tortoise 更友好
- 如果你需要 混合同步/异步 或已有 SQLAlchemy 经验 → SQLAlchemy 2.0 更稳妥
2️⃣ 语法风格对比
🔸 SQLAlchemy(表达式语言)
# 查询年龄 > 18 的用户,按名字排序
users = session.execute(
select(User).where(User.age > 18).order_by(User.name)
).scalars().all()🔸 Tortoise-ORM(Django 风格)
# 同样逻辑
users = await User.filter(age__gt=18).order_by("name")✅ Tortoise 语法更接近自然语言,上手快
✅ SQLAlchemy 更灵活(可写复杂 JOIN、子查询、CTE 等)
3️⃣ 模型定义对比
SQLAlchemy(2.0 推荐写法)
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
class Base(DeclarativeBase):
pass
class User(Base):
__tablename__ = "users"
id: Mapped[int] = mapped_column(primary_key=True)
name: Mapped[str] = mapped_column(String(50))Tortoise-ORM
class User(Model):
id = fields.IntField(pk=True)
name = fields.CharField(max_length=50)
# 表名默认为 "user"(可配置)✅ Tortoise 更简洁,无需指定__tablename__
✅ SQLAlchemy 更显式,适合大型项目规范管理
4️⃣ 数据库迁移
| 工具 | 说明 |
|---|---|
| Alembic (SQLAlchemy) | 功能强大,支持手动编辑迁移脚本、分支合并、条件升级等,适合复杂演进 |
| Aerich (Tortoise) | 自动检测模型变更生成迁移,类似 Django,简单易用,但高级功能较少 |
💡 如果你的数据库 schema 变更频繁且复杂(如金融系统)→ Alembic 更可靠
如果是快速迭代的 Web API → Aerich 足够
5️⃣ 与 FastAPI 集成
✅ SQLAlchemy + FastAPI(官方推荐方式)
- 使用
sqlalchemy.ext.asyncio+asyncpg/aiomysql - 需要自己管理 session 生命周期(可用依赖注入)
示例依赖:
async def get_db(): async with AsyncSessionLocal() as session: yield session
✅ Tortoise-ORM + FastAPI
- 提供
register_tortoise快速集成 - 自动处理连接池、关闭等
示例:
from tortoise.contrib.fastapi import register_tortoise register_tortoise( app, db_url="sqlite://db.sqlite3", modules={"models": ["models"]}, generate_schemas=True, # 开发时自动建表 )
✅ Tortoise 集成更“开箱即用”,适合快速开发
✅ SQLAlchemy 更可控,适合需要精细调优的场景
🎯 三、如何选择?—— 决策指南
✅ 选择 Tortoise-ORM 如果:
- 你正在用 FastAPI / Starlette 构建 纯异步 API
- 项目规模中等,数据模型不太复杂
- 喜欢 Django ORM 风格 的简洁语法
- 不需要复杂的 SQL 查询(如窗口函数、递归 CTE)
- 想快速启动,少写样板代码
✅ 选择 SQLAlchemy 如果:
- 你需要 最大灵活性 和 SQL 控制力
- 项目可能涉及 复杂查询、视图、存储过程
- 团队已有 SQLAlchemy 经验
- 需要支持 Oracle、MSSQL 等企业数据库
- 未来可能迁移到同步框架(如 Flask)
- 对 迁移可靠性 要求极高(Alembic 更成熟)
⚠️ 四、常见误区
❌ “Tortoise 是 SQLAlchemy 的异步替代品”
→ 不完全对。Tortoise 是独立设计的轻量 ORM,功能集比 SQLAlchemy 小,不适合复杂 OLAP 场景。
❌ “SQLAlchemy 2.0 异步很重”
→ 虽然概念多,但 2.0 已大幅简化 API,异步性能优秀(底层用 asyncpg/aiomysql)。
❌ “Tortoise 不支持关系”
→ 支持!有 ForeignKeyField, OneToOneField, ManyToManyField,但关联查询能力弱于 SQLAlchemy。
✅ 五、总结一句话
- Tortoise-ORM:为 FastAPI 量身打造的轻量异步 ORM,简单项目首选
- SQLAlchemy:Python ORM 的工业标准,复杂系统、长期维护项目的不二之选
🧪 附:快速体验命令
Tortoise-ORM 初始化
pip install tortoise-orm asyncpg aiofiles
# 自动生成模型和迁移
aerich init -t config.TORTOISE_ORM
aerich migrate --name init
aerich upgradeSQLAlchemy 2.0 + Async
pip install sqlalchemy[asyncio] asyncpg
评论已关闭