现在位置: 首页 > FastAPI 教程 > 正文

Alembic 数据库迁移

本章你将学会用 Alembic 管理数据库结构变更,理解与 Django Migration、Flask-Migrate 的异同。


为什么需要迁移工具?

Base.metadata.create_all() 同样有致命缺陷:只在表不存在时创建,修改已有表结构不会自动同步。

Alembic 是 SQLAlchemy 官方的迁移工具,Django 的 makemigrations/migrate 和 Flask 的 Flask-Migrate,底层都是借鉴了 Alembic 的设计。


安装与初始化

(venv) $ pip install alembic
(venv) $ alembic init alembic
Creating directory alembic/... done

生成的目录结构:

alembic/
├── versions/          # 迁移脚本存放目录
├── env.py             # 迁移环境配置(需手动修改!)
└── script.py.mako     # 迁移脚本模板
alembic.ini            # Alembic 配置文件

配置 env.py 连接到你的模型

这是关键步骤——Alembic 默认不知道你的 SQLAlchemy 模型在哪里。

实例

# 文件路径:alembic/env.py(修改关键部分)
import sys
from pathlib import Path

# 将项目根目录加入 sys.path(确保能导入你自己的模块)
sys.path.insert(0, str(Path(__file__).resolve().parent.parent))

from database import Base, engine
from models import Category, Post   # 导入所有模型,确保 Base.metadata 包含它们

# target_metadata 必须设置为模型的元数据
target_metadata = Base.metadata

同时修改 alembic.ini 中的数据库连接:

# 文件路径:alembic.ini
sqlalchemy.url = sqlite:///./blog.db

迁移三步曲

步骤命令作用对标 Django
初始化alembic init alembic创建迁移环境(仅一次)
生成alembic revision --autogenerate -m "描述"检测模型变化,生成迁移脚本makemigrations
执行alembic upgrade head执行所有未应用的迁移migrate

生成并执行迁移

(venv) $ alembic revision --autogenerate -m "初始化 Post 和 Category 模型"
INFO  [alembic.autogenerate] Detected added table 'categories'
INFO  [alembic.autogenerate] Detected added table 'posts'
Generating alembic/versions/xxxx_initial.py ... done

(venv) $ alembic upgrade head
INFO  [alembic.runtime.migration] Running upgrade -> xxxx, 初始化

实战:新增 read_count 字段

实例

# 文件路径:models.py 的 Post 类中新增
class Post(Base):
    # ... 已有字段 ...
    read_count = Column(Integer, default=0)   # 阅读次数
(venv) $ alembic revision --autogenerate -m "Post 新增 read_count 字段"
(venv) $ alembic upgrade head

回滚

(venv) $ alembic downgrade -1        # 回退到上一个版本

alembic upgrade head 中的 head 表示最新版本。也可以指定具体版本号:alembic upgrade xxxx(版本 ID)。


三框架迁移工具对照

操作DjangoFlask(Flask-Migrate)FastAPI(Alembic)
初始化无需flask db initalembic init alembic
生成迁移makemigrationsflask db migrate -m "描述"alembic revision --autogenerate -m "描述"
执行迁移migrateflask db upgradealembic upgrade head
回滚migrate app 0001flask db downgradealembic downgrade -1
自动化程度最高需手动配置 env.py

本章小结

本章你掌握了 Alembic 的完整流程:alembic init 初始化、配置 env.py 连接模型、revision --autogenerate 生成迁移、upgrade head 执行、downgrade 回滚。

Alembic 比 Django/Flask 的迁移工具配置步骤多,但更底层、更灵活。

下一章预告:文章多了需要搜索和分页。下一章实现关键词联合搜索和基于 offset/limit 的分页功能。