使用Alembic管理数据库版本变化
Alembic需要SQLAlchemy支持,如果项目是使用Python基于SQLAlchemy的开发的,那么可以用Alembic管理数据库版本变化。
Alembic将版本间的一组变化称为一个迁移,将变化过程称为迁移。我们可以说从一个版本迁移到另一个版本。
我们先新建一个目录alembic
初始化Alembic
1 | alembic init <YOUR_ALEMBIC_DIR> |
例如
alembic init alembic_foo,foo可以是项目的数据库名
有两个文件需要修改
alembic.ini
alembic_foo/env.py
在 alembic.ini
中修改sqlalchemy.url
例如 sqlalchemy.url = postgresql+psycopg2://用户名:密码@ip_address/dbname
在 env.py
修改 # target_metadata = mymodel.Base.metadata
修改把项目中用来定义数据模型基类的Base import进来,改成 target_metadata = Base.metadata,以便Alembic知道项目中有哪些表,表结构是什么
自动生成迁移(生成初始迁移)
1 | alembic revision --autogenerate -m <log_message> |
我都是用日期和时间作为log_message,例如
1 | alembic revision --autogenerate -m "%date:~0,4%%date:~5,2%%date:~8,2%%time:~0,2%%time:~3,2%%time:~6,2%" |
自动生成迁移的时候,Alembic会对比数据库现有的表结构和配置的Base.metadata对应的表结构,生成差异转换代码,我们首次生成的时候一般两边是一致的,所以生成的迁移脚本其实是什么都不做。
执行上面的命令可以看到会生成 alembic_foo/versions/xxxx.py
,其中xxx就是revision+log_message
1 | """20200326 91627 |
把数据库升级到最新版本
1 | alembic upgrade head |
其实会做一遍upgrade中的命令,现在为空就什么都不做。
其实alembic做了一件事,在数据库中创建了一张名为alembic_version的表,里面只有一行一列记录着当前的数据库版本
以后要修改数据库模型时的步骤如下:
(1)修改SQLAlchemy Base那边的代码,即通过ORM框架定义的表示数据表结构的Python类。
(2)执行 alembic revision --autogenerate ...
命令生成迁移脚本。
(3)检查自动生成的脚本,改成不准确的地方。(例如重命名会变成删除再添加,会丢失数据)
(4)执行 alembic upgrade head
把改动应用到数据库
降级或升级数据库
升级到最新前面已经说过了
1 | alembic upgrade head |
要指定版本的话,看到前面自动生成的py文件里面有个Revision ID,同时也是py文件的前缀。
升级到指定版本
1 | alembic upgrade <Revision ID> |
降级到指定版本
1 | alembic downgrade <Revision ID> |
参考: