Tortoise-ORMSQLModelSQLAlchemy 都是 Python 中用于操作数据库的 ORM(对象关系映射)工具,但它们在设计理念、使用场景、异步支持、与 FastAPI 的集成等方面有显著差异。下面从多个维度进行详细对比:


📊 一、核心特性对比表

特性SQLAlchemySQLModelTortoise-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...)同 SQLAlchemyPostgreSQL, 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

🔗 官方态度: