Overview
Tortoise ORM has been developed since 2018 as an asyncio ORM inspired by Django. Models inherit from tortoise.models.Model with fields such as CharField and ForeignKeyField, and queries look like Django's: await Tournament.filter(name__startswith='x').prefetch_related('events'). It supports CPython 3.10 and later with SQLite, PostgreSQL (asyncpg or psycopg), MySQL (aiomysql or asyncmy), SQL Server and Oracle.
Version 1.0.0, released on 8 February 2026, was a breaking release. It added a native migrations framework (tortoise makemigrations, migrate, sqlmigrate, downgrade) with RunPython and RunSQL data migrations, replacing the separate Aerich tool, which the docs now call legacy. It also moved all ORM state into a TortoiseContext, removed the old unittest-based test helpers in favour of pytest fixtures, and made timezone-aware datetimes the default.
The project publishes benchmarks against other Python ORMs and ships integrations for FastAPI, Starlette and other frameworks. Releases continued through 1.1.7 in March 2026. If you already know Django's ORM, most concepts carry over directly; the main differences are that every call is awaited and that setup happens through Tortoise.init or a framework integration rather than Django settings.
Pricing and plans
| Plan | Price | What you get |
|---|---|---|
| Tortoise ORM | $0 | Apache 2.0 licence |
What it does
- Async-native queries
- Every query is awaitable; no thread pools or greenlet bridges.
- Django-style API
- Models, fields, filter lookups with double underscores, prefetch_related and aggregation similar to Django's ORM.
- Built-in migrations
- Autodetects model changes and writes reversible migrations with a CLI, since 1.0.
- PostgreSQL full-text search
- TSVectorField, SearchVector, SearchQuery and GIN/GiST index support added in 1.0.
- Framework integrations
- Helpers for FastAPI (RegisterTortoise), Starlette and others, plus Pydantic model generation.
Strengths and limitations
Strengths
- Natural fit for async frameworks without sync-to-async bridges
- Familiar to anyone who has used Django's ORM
- Migrations are now part of the library
- Supports SQL Server and Oracle as well as the usual open-source databases
Limitations
- 1.0 introduced breaking changes: context-based state, removed test base classes and use_tz defaulting to True
- Async only, so it is awkward in synchronous scripts; multiple asyncio.run() calls need explicit context handling
- Smaller community than SQLAlchemy or Django, with hundreds of open issues
- Type checking of queries is weaker than SQLAlchemy 2.0's typed mappings
Who it suits
Good for
- FastAPI or Starlette services that want a Django-like ORM
- Teams moving from Django to async Python
Look elsewhere if
- Synchronous applications (SQLAlchemy, Peewee or Django fit better)
- Projects needing the widest database or dialect coverage
Pricing history
-
Tortoise ORM 1.0 with built-in migrations
Tortoise ORM 1.0.0 added a native migrations framework (makemigrations/migrate) replacing Aerich, a context-based architecture, and made timezone-aware datetimes the default. Source ↗
Alternatives to Tortoise ORM
| Tool | From | Free option | Stages |
|---|---|---|---|
| Entity Framework Core .NET ORM | — | ||
| Bun (Go ORM) SQL-first Go ORM | — | ||
| GORM Full-featured Go ORM | — | ||
| SQLAlchemy Python SQL toolkit and ORM | — | ||
| SQLModel Python ORM on SQLAlchemy and Pydantic | — | ||
| Knex.js JavaScript SQL query builder | — |
Questions
Does Tortoise ORM have migrations?
Yes. Since 1.0 it ships a native migration framework with makemigrations and migrate commands; Aerich is now the legacy option.
Is Tortoise ORM async?
Yes, it is built for asyncio and every query is awaited.
Which databases does Tortoise ORM support?
SQLite, PostgreSQL, MySQL, Microsoft SQL Server and Oracle.
Sources read for this page