首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Alembic 使用指南

Alembic 使用指南

作者头像
井九
发布2026-07-08 12:20:09
发布2026-07-08 12:20:09
60
举报
文章被收录于专栏:四楼没电梯四楼没电梯

目录

  • 什么是 Alembic
  • 为什么需要 Alembic
  • Alembic 工作原理
  • 安装
  • 初始化项目
  • 配置数据库
  • 创建第一个 Migration
  • 升级数据库
  • 回滚数据库
  • 自动生成 Migration
  • 修改 Migration
  • 数据迁移
  • Branch(分支)
  • Merge(合并)
  • Stamp 的使用
  • 常用命令
  • env.py 详解
  • 与 SQLAlchemy 结合
  • FastAPI 中使用
  • 多数据库支持
  • 企业最佳实践
  • 常见问题

在这里插入图片描述
在这里插入图片描述

一、什么是 Alembic

Alembic 是 SQLAlchemy 官方维护的数据库版本管理工具(Migration Tool)。

作用类似:

  • Django Migration
  • Laravel Migration
  • Flyway
  • Liquibase

它负责:

让数据库结构像代码一样可以进行版本控制。

例如:

今天数据库

代码语言:javascript
复制
user
------
id
name

明天增加

代码语言:javascript
复制
email

Alembic 会记录:

代码语言:javascript
复制
V1
↓

V2
↓

V3

任何时候都可以:

  • 升级
  • 回滚
  • 查看历史

二、为什么需要 Alembic

假设没有 Migration。

开发:

代码语言:javascript
复制
ALTER TABLE user
ADD email varchar(100);

测试:

代码语言:javascript
复制
ALTER TABLE user
ADD phone varchar(20);

线上:

忘了执行……

于是:

代码语言:javascript
复制
代码
↓

找不到字段

↓

程序崩溃

Migration 就是解决这个问题。


三、Alembic 工作原理

真正执行的是:

代码语言:javascript
复制
Migration Script

不是 Model。


四、安装

代码语言:javascript
复制
pip install alembic

如果没有 SQLAlchemy:

代码语言:javascript
复制
pip install sqlalchemy

FastAPI:

代码语言:javascript
复制
pip install fastapi sqlalchemy alembic

五、初始化项目

执行:

代码语言:javascript
复制
alembic init alembic

生成:

代码语言:javascript
复制
project/

    alembic/

        versions/

        env.py

        script.py.mako

    alembic.ini

目录说明:

代码语言:javascript
复制
alembic.ini

↓

数据库配置

----------------

env.py

↓

迁移入口

----------------

versions

↓

所有 Migration

六、配置数据库

修改:

代码语言:javascript
复制
alembic.ini

例如:

代码语言:javascript
复制
sqlalchemy.url = mysql+pymysql://root:123456@127.0.0.1/demo

更推荐:

不要写死。

修改:

env.py

例如:

代码语言:javascript
复制
from app.config import settings

config.set_main_option(
    "sqlalchemy.url",
    settings.DATABASE_URL
)

这样:

代码语言:javascript
复制
开发

测试

生产

都可以使用不同配置。


七、SQLAlchemy Model

例如:

代码语言:javascript
复制
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:

代码语言:javascript
复制
from app.models import Base

target_metadata = Base.metadata

这一步非常重要。

Alembic 自动比较:

代码语言:javascript
复制
数据库

VS

metadata

八、创建 Migration

手动:

代码语言:javascript
复制
alembic revision -m "create user"

生成:

代码语言:javascript
复制
versions/

20260628_create_user.py

里面:

代码语言:javascript
复制
def upgrade():
    pass

def downgrade():
    pass

自己写:

代码语言:javascript
复制
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")

九、自动生成 Migration

推荐:

代码语言:javascript
复制
alembic revision --autogenerate -m "add email"

Alembic:

代码语言:javascript
复制
Model

↓

比较数据库

↓

自动生成 SQL

例如:

Model:

代码语言:javascript
复制
email=Column(String(100))

生成:

代码语言:javascript
复制
op.add_column(

    "user",

    sa.Column("email",sa.String(100))
)

十、升级数据库

最新版本:

代码语言:javascript
复制
alembic upgrade head

指定版本:

代码语言:javascript
复制
alembic upgrade 6b3c1f

升级一步:

代码语言:javascript
复制
alembic upgrade +1

流程:


十一、查看历史

代码语言:javascript
复制
alembic history

输出:

代码语言:javascript
复制
v1

↓

v2

↓

v3

查看当前:

代码语言:javascript
复制
alembic current

查看 head:

代码语言:javascript
复制
alembic heads

十二、回滚数据库

回退一步:

代码语言:javascript
复制
alembic downgrade -1

回退指定版本:

代码语言:javascript
复制
alembic downgrade 6b3c1f

全部删除:

代码语言:javascript
复制
alembic downgrade base

流程:


十三、修改 Migration

例如:

新增:

代码语言:javascript
复制
age

生成:

代码语言:javascript
复制
def upgrade():

    op.add_column(

        "user",

        sa.Column("age",sa.Integer())
    )

删除:

代码语言:javascript
复制
op.drop_column(
    "user",
    "age"
)

修改字段:

代码语言:javascript
复制
op.alter_column(
    "user",
    "name",
    nullable=False
)

十四、数据迁移

Migration 不只是修改表。

还可以修改数据。

例如:

代码语言:javascript
复制
from alembic import op

def upgrade():

    conn=op.get_bind()

    conn.execute(

        sa.text(

        """
        UPDATE user

        SET age=18

        WHERE age IS NULL
        """
        )

    )

这是企业里最常见的操作。


十五、Branch(分支)

多人开发:

A:

代码语言:javascript
复制
V1

↓

V2

B:

代码语言:javascript
复制
V1

↓

V3

变成:

Alembic:

代码语言:javascript
复制
Multiple Heads

查看:

代码语言:javascript
复制
alembic heads

十六、Merge

合并:

代码语言:javascript
复制
alembic merge heads -m "merge branch"

变成:

以后:

代码语言:javascript
复制
upgrade head

不会报错。


十七、Stamp

有时候:

数据库已经存在。

但是没有 Migration。

可以:

代码语言:javascript
复制
alembic stamp head

作用:

代码语言:javascript
复制
只记录版本

不执行 SQL

非常适合:

旧项目接入 Alembic。


十八、env.py 工作流程

env.py:

负责:

  • 创建 Engine
  • 获取 Metadata
  • 比较数据库
  • 执行 Migration

十九、常用命令

命令

说明

init

初始化

revision

创建 Migration

revision --autogenerate

自动生成

upgrade head

升级

downgrade

回滚

history

历史

current

当前版本

heads

多个 Head

merge

合并

stamp

记录版本


二十、FastAPI 集成

项目:

代码语言:javascript
复制
app/

models/

config.py

main.py

alembic/

config:

代码语言:javascript
复制
DATABASE_URL="mysql+pymysql://..."

env.py:

代码语言:javascript
复制
from app.models import Base
from app.config import DATABASE_URL

target_metadata=Base.metadata

config.set_main_option(
    "sqlalchemy.url",
    DATABASE_URL
)

部署:

代码语言:javascript
复制
docker

↓

启动

↓

alembic upgrade head

↓

启动 FastAPI

二十一、多数据库

env.py:

代码语言:javascript
复制
DATABASE_URLS={

    "master":"...",

    "report":"..."
}

分别执行:

代码语言:javascript
复制
upgrade(master)

upgrade(report)

企业常见:

  • 主库
  • 日志库
  • BI 库

二十二、最佳实践

永远使用 Autogenerate

代码语言:javascript
复制
alembic revision --autogenerate

不要全部手写。


检查 Migration

自动生成并不是万能。

例如:

字段改名:

代码语言:javascript
复制
name

↓

username

Alembic:

可能:

代码语言:javascript
复制
drop

+

create

而不是:

代码语言:javascript
复制
rename

需要人工修改。


一个功能一个 Migration

不要:

代码语言:javascript
复制
1000 行

建议:

代码语言:javascript
复制
新增订单

↓

一个 Migration

新增支付

↓

一个 Migration

方便回滚。


不要修改历史 Migration

已经上线:

代码语言:javascript
复制
20250101_create_user.py

不要再修改。

新增:

代码语言:javascript
复制
20250203_add_email.py

Migration 要进入 Git

必须提交:

代码语言:javascript
复制
versions/

否则:

其他开发无法同步数据库。


CI/CD 自动执行

部署:

代码语言:javascript
复制
git pull

pip install -r requirements.txt

alembic upgrade head

systemctl restart app

二十三、常见问题

为什么 autogenerate 没检测到?

一般原因:

没有设置:

代码语言:javascript
复制
target_metadata

为什么提示 Multiple Heads?

多人同时开发。

执行:

代码语言:javascript
复制
merge

即可。


为什么 downgrade 失败?

因为:

upgrade 写了:

代码语言:javascript
复制
create_table

但是:

downgrade 没写:

代码语言:javascript
复制
drop_table

为什么删除字段后数据丢失?

Migration 本质执行:

代码语言:javascript
复制
ALTER TABLE

DROP COLUMN

无法恢复。

建议:

先:

代码语言:javascript
复制
rename

↓

备份

↓

删除

二十四、企业推荐工作流


总结

Alembic 是 SQLAlchemy 官方推荐的数据库迁移工具,它通过维护数据库版本脚本,实现数据库结构与代码同步演进。熟练掌握 Alembic 不仅可以完成字段新增、删除、修改等基础操作,还能应对多人协作、分支合并、数据迁移、CI/CD 自动部署等企业级场景。

建议遵循以下原则:

  • 使用 --autogenerate 自动生成迁移脚本,再人工审核
  • 每次业务变更对应一个独立 Migration
  • 历史 Migration 一旦上线,不再修改
  • versions/ 纳入 Git 版本控制
  • 在 CI/CD 中自动执行 alembic upgrade head
  • 对涉及数据变更的 Migration,务必编写可回滚逻辑并充分测试

掌握这些实践后,Alembic 将成为团队数据库版本管理的核心工具,帮助项目在持续迭代中保持数据库结构的一致性、可追溯性和可维护性。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2026-07-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 目录
  • 一、什么是 Alembic
  • 二、为什么需要 Alembic
  • 三、Alembic 工作原理
  • 四、安装
  • 五、初始化项目
  • 六、配置数据库
  • 七、SQLAlchemy Model
  • 八、创建 Migration
  • 九、自动生成 Migration
  • 十、升级数据库
  • 十一、查看历史
  • 十二、回滚数据库
  • 十三、修改 Migration
  • 十四、数据迁移
  • 十五、Branch(分支)
  • 十六、Merge
  • 十七、Stamp
  • 十八、env.py 工作流程
  • 十九、常用命令
  • 二十、FastAPI 集成
  • 二十一、多数据库
  • 二十二、最佳实践
    • 永远使用 Autogenerate
    • 检查 Migration
    • 一个功能一个 Migration
    • 不要修改历史 Migration
    • Migration 要进入 Git
    • CI/CD 自动执行
  • 二十三、常见问题
    • 为什么 autogenerate 没检测到?
    • 为什么提示 Multiple Heads?
    • 为什么 downgrade 失败?
    • 为什么删除字段后数据丢失?
  • 二十四、企业推荐工作流
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档