Tortoise-ORM、SQLModel 和 SQLAlchemy 都是 Python 中用于操作数据库的 ORM(对象关系映射)工具,但它们在设计理念、使用场景、异步支持、与 FastAPI 的集成等方面有显著差异。下面从多个维度进行详细对比:
📊 一、核心特性对比表
| 特性 | SQLAlchemy | SQLModel | Tortoise-ORM |
|---|---|---|---|
| 作者/背景 | Michael Bayer(老牌权威) | Sebastian Ramírez(FastAPI 作者) | Andrey Babak(受 Django ORM 启发) |
| 首次发布 | 2005 年 | 2021 年 | 2019 年 |
| 异步支持 | ✅(v1.4+,需用 asyncio + asyncpg/aiomysql) | ❌(基于 SQLAlchemy Core,不支持原生异步) | ✅(原生异步,专为 asyncio 设计) |
| 同步支持 | ✅(主力) | ✅ | ❌(仅异步) |
| 类型提示 | ⚠️ 较弱(需额外配置) | ✅✅✅(Pydantic 深度集成,强类型) | ✅(良好,基于 Pydantic) |
| 与 FastAPI 集成 | 良好(社区方案多) | ✅✅✅(官方推荐,无缝集成) | ✅(常用,但非官方) |
| 语法风格 | 灵活但复杂(Query API) | 极简(继承自 Pydantic) | 类似 Django(.filter(), .get()) |
| 迁移工具 | Alembic(成熟) | Alembic(兼容) | Aerich(Tortoise 官方,较新) |
| 支持数据库 | 几乎所有(PostgreSQL, MySQL, SQLite, Oracle...) | 同 SQLAlchemy | PostgreSQL, MySQL, SQLite, CockroachDB |
| 学习曲线 | 陡峭(功能强大但复杂) | 平缓(极简) | 中等(Django 用户友好) |
🔍 二、详细分析
1. SQLAlchemy
- 定位:Python 最成熟、功能最全的 ORM,企业级首选。
优点:
- 功能极其强大(复杂查询、连接池、事务控制、自定义 SQL 等)
- 社区庞大,文档完善,插件丰富
- Alembic 迁移工具非常稳定
缺点:
- 异步支持是“后加”的,写法略别扭(需
await session.execute(select(...))) - 类型提示体验差(需
mypy插件或手动注解) - 对 FastAPI 新手不够友好
- 异步支持是“后加”的,写法略别扭(需
适用场景:
- 大型项目、复杂业务逻辑
- 需要精细控制 SQL 或使用冷门数据库
- 团队已有 SQLAlchemy 经验
✅ 示例(异步):
from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy import select async def get_user(session: AsyncSession, user_id: int): result = await session.execute(select(User).where(User.id == user_id)) return result.scalar_one_or_none()
2. SQLModel
- 定位:FastAPI 作者为简化数据模型而造,目标是“一个模型同时用于 ORM 和 API Schema”。
优点:
- 代码极简:模型 = Pydantic Model + SQLAlchemy Table
- 强类型安全:IDE 自动补全、mypy 零配置
- 与 FastAPI 无缝集成(直接返回模型实例)
- 学习成本极低(会 Pydantic 就会 SQLModel)
缺点:
- 不支持异步(底层是 SQLAlchemy Core 同步版)
- 功能有限(复杂查询仍需回退到 SQLAlchemy)
- 迁移依赖 Alembic,配置稍繁琐
适用场景:
- FastAPI 快速原型开发
- CRUD 为主的中小型项目
- 团队重视开发体验和类型安全
✅ 示例:
from sqlmodel import SQLModel, Field, create_engine, Session, select class User(SQLModel, table=True): id: int = Field(default=None, primary_key=True) name: str engine = create_engine("sqlite:///db.sqlite") with Session(engine) as session: user = session.exec(select(User).where(User.name == "Alice")).first()
3. Tortoise-ORM
- 定位:专为 asyncio 设计的异步 ORM,灵感来自 Django ORM。
优点:
- 原生异步,写法自然(
await User.get(id=1)) - 查询语法简洁(
.filter(name="Alice").first()) - 内置 Pydantic 支持(
.pydantic_model()) - Aerich 迁移工具简单易用
- 原生异步,写法自然(
缺点:
- 仅支持异步(无法用于同步项目)
- 社区较小,文档不如 SQLAlchemy 完善
- 复杂查询能力弱于 SQLAlchemy
适用场景:
- FastAPI + 异步数据库(如 asyncpg)
- 需要高并发 I/O(如 WebSocket + DB)
- 喜欢 Django ORM 风格的开发者
✅ 示例:
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="Alice").all()
🧪 三、如何选择?
| 你的需求 | 推荐 |
|---|---|
| 用 FastAPI + 异步数据库(PostgreSQL/MySQL) | ✅ Tortoise-ORM |
| 用 FastAPI + SQLite / 简单 CRUD / 重视开发体验 | ✅ SQLModel |
| 需要复杂查询、事务、企业级功能 | ✅ SQLAlchemy(异步版) |
| 团队熟悉 Django | ✅ Tortoise-ORM |
| 项目必须同步(如 Flask) | ✅ SQLAlchemy 或 SQLModel |
🚫 常见误区
- 误区1:“SQLModel 支持异步”
→ 错!它底层是 SQLAlchemy 同步引擎,强行用async会阻塞事件循环。 - 误区2:“Tortoise 功能弱,不能上生产”
→ 不对!它已被用于多个高并发项目(如 Discord bot 后端),只要不涉及超复杂查询即可。 - 误区3:“SQLAlchemy 异步很难用”
→ v2.0 后已大幅简化,但仍有学习成本。
💡 总结建议
- 如果你在写 FastAPI 且用异步数据库(如 asyncpg)→ 选 Tortoise-ORM
(你当前的扫码轮询场景就非常适合!) - 如果你在写小型 FastAPI 应用,用 SQLite,追求极致简洁 → 选 SQLModel
- 如果你需要 JOIN 多表、CTE、窗口函数等高级 SQL → 选 SQLAlchemy
🔗 官方态度:
- FastAPI 文档 推荐 SQLModel 作为默认 ORM
- 但同时也 提供 Tortoise-ORM 教程