
Alembic 是 SQLAlchemy 官方维护的数据库版本管理工具(Migration Tool)。
作用类似:
它负责:
让数据库结构像代码一样可以进行版本控制。
例如:
今天数据库
user
------
id
name明天增加
emailAlembic 会记录:
V1
↓
V2
↓
V3任何时候都可以:
假设没有 Migration。
开发:
ALTER TABLE user
ADD email varchar(100);测试:
ALTER TABLE user
ADD phone varchar(20);线上:
忘了执行……
于是:
代码
↓
找不到字段
↓
程序崩溃Migration 就是解决这个问题。

真正执行的是:
Migration Script不是 Model。
pip install alembic如果没有 SQLAlchemy:
pip install sqlalchemyFastAPI:
pip install fastapi sqlalchemy alembic执行:
alembic init alembic生成:
project/
alembic/
versions/
env.py
script.py.mako
alembic.ini目录说明:
alembic.ini
↓
数据库配置
----------------
env.py
↓
迁移入口
----------------
versions
↓
所有 Migration修改:
alembic.ini例如:
sqlalchemy.url = mysql+pymysql://root:123456@127.0.0.1/demo更推荐:
不要写死。
修改:
env.py
例如:
from app.config import settings
config.set_main_option(
"sqlalchemy.url",
settings.DATABASE_URL
)这样:
开发
测试
生产都可以使用不同配置。
例如:
from sqlalchemy.orm import DeclarativeBase
from sqlalchemy import Column,Integer,String
class Base(DeclarativeBase):
pass
class User(Base):
__tablename__="user"
id=Column(Integer,primary_key=True)
name=Column(String(50))env.py:
from app.models import Base
target_metadata = Base.metadata这一步非常重要。
Alembic 自动比较:
数据库
VS
metadata手动:
alembic revision -m "create user"生成:
versions/
20260628_create_user.py里面:
def upgrade():
pass
def downgrade():
pass自己写:
from alembic import op
import sqlalchemy as sa
def upgrade():
op.create_table(
"user",
sa.Column("id",sa.Integer(),primary_key=True),
sa.Column("name",sa.String(50))
)
def downgrade():
op.drop_table("user")推荐:
alembic revision --autogenerate -m "add email"Alembic:
Model
↓
比较数据库
↓
自动生成 SQL例如:
Model:
email=Column(String(100))生成:
op.add_column(
"user",
sa.Column("email",sa.String(100))
)最新版本:
alembic upgrade head指定版本:
alembic upgrade 6b3c1f升级一步:
alembic upgrade +1流程:

alembic history输出:
v1
↓
v2
↓
v3查看当前:
alembic current查看 head:
alembic heads回退一步:
alembic downgrade -1回退指定版本:
alembic downgrade 6b3c1f全部删除:
alembic downgrade base流程:

例如:
新增:
age生成:
def upgrade():
op.add_column(
"user",
sa.Column("age",sa.Integer())
)删除:
op.drop_column(
"user",
"age"
)修改字段:
op.alter_column(
"user",
"name",
nullable=False
)Migration 不只是修改表。
还可以修改数据。
例如:
from alembic import op
def upgrade():
conn=op.get_bind()
conn.execute(
sa.text(
"""
UPDATE user
SET age=18
WHERE age IS NULL
"""
)
)这是企业里最常见的操作。
多人开发:
A:
V1
↓
V2B:
V1
↓
V3变成:

Alembic:
Multiple Heads查看:
alembic heads合并:
alembic merge heads -m "merge branch"变成:

以后:
upgrade head不会报错。
有时候:
数据库已经存在。
但是没有 Migration。
可以:
alembic stamp head作用:
只记录版本
不执行 SQL非常适合:
旧项目接入 Alembic。

env.py:
负责:
命令 | 说明 |
|---|---|
init | 初始化 |
revision | 创建 Migration |
revision --autogenerate | 自动生成 |
upgrade head | 升级 |
downgrade | 回滚 |
history | 历史 |
current | 当前版本 |
heads | 多个 Head |
merge | 合并 |
stamp | 记录版本 |
项目:
app/
models/
config.py
main.py
alembic/config:
DATABASE_URL="mysql+pymysql://..."env.py:
from app.models import Base
from app.config import DATABASE_URL
target_metadata=Base.metadata
config.set_main_option(
"sqlalchemy.url",
DATABASE_URL
)部署:
docker
↓
启动
↓
alembic upgrade head
↓
启动 FastAPIenv.py:
DATABASE_URLS={
"master":"...",
"report":"..."
}分别执行:
upgrade(master)
upgrade(report)企业常见:
alembic revision --autogenerate不要全部手写。
自动生成并不是万能。
例如:
字段改名:
name
↓
usernameAlembic:
可能:
drop
+
create而不是:
rename需要人工修改。
不要:
1000 行建议:
新增订单
↓
一个 Migration
新增支付
↓
一个 Migration方便回滚。
已经上线:
20250101_create_user.py不要再修改。
新增:
20250203_add_email.py必须提交:
versions/否则:
其他开发无法同步数据库。
部署:
git pull
pip install -r requirements.txt
alembic upgrade head
systemctl restart app一般原因:
没有设置:
target_metadata多人同时开发。
执行:
merge即可。
因为:
upgrade 写了:
create_table但是:
downgrade 没写:
drop_tableMigration 本质执行:
ALTER TABLE
DROP COLUMN无法恢复。
建议:
先:
rename
↓
备份
↓
删除
Alembic 是 SQLAlchemy 官方推荐的数据库迁移工具,它通过维护数据库版本脚本,实现数据库结构与代码同步演进。熟练掌握 Alembic 不仅可以完成字段新增、删除、修改等基础操作,还能应对多人协作、分支合并、数据迁移、CI/CD 自动部署等企业级场景。
建议遵循以下原则:
--autogenerate 自动生成迁移脚本,再人工审核versions/ 纳入 Git 版本控制alembic upgrade head掌握这些实践后,Alembic 将成为团队数据库版本管理的核心工具,帮助项目在持续迭代中保持数据库结构的一致性、可追溯性和可维护性。