SQLAlchemyTortoise-ORM 都是 Python 中流行的 ORM(对象关系映射)工具,但它们的设计哲学、适用场景和生态支持有显著差异。下面我将从 核心特性、语法风格、异步支持、生态兼容性、适用场景 等多个维度进行横向对比,并给出明确的选型建议。


📊 一、快速总览对比表

特性SQLAlchemyTortoise-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
  • 需要显式使用 AsyncSessionasync 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,简单项目首选
  • SQLAlchemyPython ORM 的工业标准,复杂系统、长期维护项目的不二之选

🧪 附:快速体验命令

Tortoise-ORM 初始化

pip install tortoise-orm asyncpg aiofiles
# 自动生成模型和迁移
aerich init -t config.TORTOISE_ORM
aerich migrate --name init
aerich upgrade

SQLAlchemy 2.0 + Async

pip install sqlalchemy[asyncio] asyncpg