
Product
A Fresh Look for the Socket Dashboard
We’ve redesigned the Socket dashboard with simpler navigation, less visual clutter, and a cleaner UI that highlights what really matters.
English | Русский
Aerich is a database migrations tool for TortoiseORM, which is like alembic for SQLAlchemy, or like Django ORM with it's own migration solution.
Just install from pypi:
pip install "aerich[toml]"
> aerich -h
Usage: aerich [OPTIONS] COMMAND [ARGS]...
Options:
-V, --version Show the version and exit.
-c, --config TEXT Config file. [default: pyproject.toml]
--app TEXT Tortoise-ORM app name.
-h, --help Show this message and exit.
Commands:
downgrade Downgrade to specified version.
heads Show current available heads in migrate location.
history List all migrate items.
init Init config file and generate root migrate location.
init-db Generate schema and generate app migrate location.
inspectdb Introspects the database tables to standard output as...
migrate Generate migrate changes file.
upgrade Upgrade to specified version.
You need to add aerich.models
to your Tortoise-ORM
config first. Example:
TORTOISE_ORM = {
"connections": {"default": "mysql://root:123456@127.0.0.1:3306/test"},
"apps": {
"models": {
"models": ["tests.models", "aerich.models"],
"default_connection": "default",
},
},
}
> aerich init -h
Usage: aerich init [OPTIONS]
Init config file and generate root migrate location.
Options:
-t, --tortoise-orm TEXT Tortoise-ORM config module dict variable, like
settings.TORTOISE_ORM. [required]
--location TEXT Migrate store location. [default: ./migrations]
-s, --src_folder TEXT Folder of the source, relative to the project root.
-h, --help Show this message and exit.
Initialize the config file and migrations location:
> aerich init -t tests.backends.mysql.TORTOISE_ORM
Success create migrate location ./migrations
Success write config to pyproject.toml
Note: aerich will import the config file when running init-db/migrate/upgrade/heads/history commands, so it is better to keep this file simple and clean.
> aerich init-db
Success create app migrate location ./migrations/models
Success generate schema for app "models"
If your Tortoise-ORM app is not the default models
, you must specify the correct app via --app
,
e.g. aerich --app other_models init-db
.
> aerich migrate --name drop_column
Success migrate 1_202029051520102929_drop_column.py
Format of migrate filename is
{version_num}_{datetime}_{name|update}.py
.
If aerich
guesses you are renaming a column, it will ask Rename {old_column} to {new_column} [True]
. You can choose
True
to rename column without column drop, or choose False
to drop the column then create. Note that the latter may
lose data.
If you need to manually write migration, you could generate empty file:
> aerich migrate --name add_index --empty
Success migrate 1_202326122220101229_add_index.py
> aerich upgrade
Success upgrade 1_202029051520102929_drop_column.py
Now your db is migrated to latest.
> aerich downgrade -h
Usage: aerich downgrade [OPTIONS]
Downgrade to specified version.
Options:
-v, --version INTEGER Specified version, default to last. [default: -1]
-d, --delete Delete version files at the same time. [default:
False]
--yes Confirm the action without prompting.
-h, --help Show this message and exit.
> aerich downgrade
Success downgrade 1_202029051520102929_drop_column.py
Now your db is rolled back to the specified version.
> aerich history
1_202029051520102929_drop_column.py
> aerich heads
1_202029051520102929_drop_column.py
Currently inspectdb
support MySQL & Postgres & SQLite.
Usage: aerich inspectdb [OPTIONS]
Introspects the database tables to standard output as TortoiseORM model.
Options:
-t, --table TEXT Which tables to inspect.
-h, --help Show this message and exit.
Inspect all tables and print to console:
aerich --app models inspectdb
Inspect a specified table in the default app and redirect to models.py
:
aerich inspectdb -t user > models.py
For example, you table is:
CREATE TABLE `test`
(
`id` int NOT NULL AUTO_INCREMENT,
`decimal` decimal(10, 2) NOT NULL,
`date` date DEFAULT NULL,
`datetime` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`time` time DEFAULT NULL,
`float` float DEFAULT NULL,
`string` varchar(200) COLLATE utf8mb4_general_ci DEFAULT NULL,
`tinyint` tinyint DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `asyncmy_string_index` (`string`)
) ENGINE = InnoDB
DEFAULT CHARSET = utf8mb4
COLLATE = utf8mb4_general_ci
Now run aerich inspectdb -t test
to see the generated model:
from tortoise import Model, fields
class Test(Model):
date = fields.DateField(null=True)
datetime = fields.DatetimeField(auto_now=True)
decimal = fields.DecimalField(max_digits=10, decimal_places=2)
float = fields.FloatField(null=True)
id = fields.IntField(primary_key=True)
string = fields.CharField(max_length=200, null=True)
time = fields.TimeField(null=True)
tinyint = fields.BooleanField(null=True)
Note that this command is limited and can't infer some fields, such as IntEnumField
, ForeignKeyField
, and others.
tortoise_orm = {
"connections": {
"default": "postgres://postgres_user:postgres_pass@127.0.0.1:5432/db1",
"second": "postgres://postgres_user:postgres_pass@127.0.0.1:5432/db2",
},
"apps": {
"models": {"models": ["tests.models", "aerich.models"], "default_connection": "default"},
"models_second": {"models": ["tests.models_second"], "default_connection": "second", },
},
}
You only need to specify aerich.models
in one app, and must specify --app
when running aerich migrate
and so on, e.g. aerich --app models_second migrate
.
aerich
workflowIn some cases, such as broken changes from upgrade of aerich
, you can't run aerich migrate
or aerich upgrade
, you
can make the following steps:
aerich
table.migrations/{app}
directory.aerich init-db
.Note that these actions is safe, also you can do that to reset your migrations if your migration files is too many.
aerich
in applicationYou can use aerich
out of cli by use Command
class.
from aerich import Command
async with Command(tortoise_config=config, app='models') as command:
await command.migrate('test')
await command.upgrade()
--fake
optionMarks the migrations up to the latest one(or back to the target one) as applied, but without actually running the SQL to change your database schema.
aerich upgrade --fake
aerich --app models upgrade --fake
aerich downgrade --fake -v 2
aerich --app models downgrade --fake -v 2
You can tell aerich to ignore table by setting managed=False
in the Meta
class, e.g.:
class MyModel(Model):
class Meta:
managed = False
Note managed=False
does not recognized by tortoise-orm
and aerich init-db
, it is only for aerich migrate
.
This project is licensed under the Apache-2.0 License.
FAQs
A database migrations tool for Tortoise ORM.
We found that aerich demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Product
We’ve redesigned the Socket dashboard with simpler navigation, less visual clutter, and a cleaner UI that highlights what really matters.
Industry Insights
Terry O’Daniel, Head of Security at Amplitude, shares insights on building high-impact security teams, aligning with engineering, and why AI gives defenders a fighting chance.
Security News
MCP spec updated with structured tool output, stronger OAuth 2.1 security, resource indicators, and protocol cleanups for safer, more reliable AI workflows.