Alembic 异步数据库迁移
适用于 FastAPI + SQLAlchemy 异步 ORM 项目,基于 Alembic 1.8+。
安装
|
|
初始化迁移仓库
|
|
- 会在项目根目录生成
alembic/文件夹和alembic.ini --template async表示使用异步数据库驱动(如aiomysql或asyncmy)- 同步项目不需要加该参数
配置 alembic.ini
打开 alembic.ini,注释掉默认的数据库连接字符串:
|
|
因为数据库 URL 将通过代码动态设置。
配置 env.py
关键修改如下:
|
|
必须导入所有模型(如 from db.models import *),否则 autogenerate 会认为数据库中没有表,可能生成错误的 DROP TABLE 语句。
基本迁移命令
生成迁移脚本(自动检测模型变更):
|
|
应用迁移(更新数据库):
|
|
其他常用命令
查看当前版本:
|
|
查看迁移历史:
|
|
回滚上一次迁移:
|
|
关键问题与解决方案
新字段无默认值,已有数据行为空
现象:
模型中使用 default="test",但数据库中新增列仍为 NULL。
原因:
default 是 Python 层默认值,仅在通过 SQLAlchemy ORM 创建对象时生效。
它不会生成 SQL 的 DEFAULT 约束,也不影响数据库中已有数据。
正确做法:
使用 server_default 设置数据库级默认值:
|
|
迁移执行时,已有行会自动填充该值。
注意:
default与server_default作用层面不同,不可互换。
回滚后无法生成新迁移(Target database is not up to date)
现象:
执行 alembic downgrade -1 后,运行 alembic revision --autogenerate 报错。
原因:
Alembic 要求生成新迁移时,数据库版本必须与本地最新迁移(head)一致。
回滚后,数据库版本落后于 alembic/versions/ 中的 head,触发保护机制。
解决方法:
- 删除错误的迁移文件(如
ec704f265356_xxx.py) - 确保
alembic heads与alembic current输出一致 - 重新生成迁移脚本
在本地开发阶段,删除未部署的迁移文件是安全的做法。
误删迁移文件导致 “Can’t locate revision”
现象:
|
|
原因:
数据库 alembic_version 表中记录了一个版本 ID,但本地 alembic/versions/ 目录中已无对应文件。
解决方法(仅限本地开发):
- 删除数据库中的版本表:
1DROP TABLE alembic_version; - 清空或保留基础迁移文件于
alembic/versions/ - 重新生成初始迁移:
1 2alembic revision --autogenerate -m "initial" alembic upgrade head
目录
相关文章
Fastapi的ORM表关系
来简单实验一下FastAPI + SQLAlchemy 的 orm表关系,主要是 ForeignKey(数据库约束) + relationship(ORM 对象导航)
2025-7-6
Fastapi的ORM初始化以及增删改查
来简单实验一下FastAPI + SQLAlchemy 的 异步ORM,主要是初始化建表以及数据增删改查
2025-7-4
Fastapi的中间件与依赖注入
来简单实验一下Fastapi的中间件与依赖注入,了解其含义、主要作用以及运行方式
2025-7-3
Fastapi的基础实验
来简单实验一下 Fastapi中基础内容,包括基础实现、多种参数、响应请求以及异常处理,其他内容后面会写
2025-7-2
Python 执行模型与并发体系
来理解一下 python中的进程、线程、协程、GIL锁以及异步同步
2025-12-1