posts - 225, comments - 62, trackbacks - 0, articles - 0
   :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理
Alembic需要SQLAlchemy支持,如果项目是使用Python基于SQLAlchemy的开发的,那么可以用Alembic管理数据库版本变化,否则可能不适合
Alembic将版本间的一组变化称为一个迁移,将变化过程称为迁移。我们可以说从一个版本迁移到另一个版本。
我们先新建一个目录alembic
在其中初始化Alembic
alembic init <YOUR_ALEMBIC_DIR>
例如 alembic init migrations
有两个文件需要修改
alembic.ini migrations/env.py
在alembic.ini中修改sqlalchemy.url
例如 sqlalchemy.url = postgresql+psycopg2://用户名:密码@ip_address/dbname
在 env.py修改 # target_metadata = mymodel.Base.metadata
修改把项目中的Base导进来,改成 target_metadata = Base.metadata,以便Alembic知道项目中有哪些表,表结构是什么
自动生成迁移(生成初始迁移也一样)
alembic revision --autogenerate -m <log_message>
例如 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对应的表结构,生成差异转换代码,我们首次生成的时候一般两边是一致的,所以生成的迁移脚本其实是什么都不做。
执行上面的命令可以看到会生成migrations/versions/xxxx.py
"""20200326 91627
Revision ID: bab1fb444e93
Revises:
Create Date: 2020-03-26 09:16:31.264071
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = 'bab1fb444e93'
down_revision = None
branch_labels = None
depends_on = None
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
pass
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
pass
# ### end Alembic commands ###
执行 alembic upgrade head
把数据库升级到最新版本,其实会做一遍upgrade中的命令,现在为空就什么都不做。
其实alembic做了一件事,在数据库中创建了一张名为alembic_version的表,里面只有一行一列记录着当前的数据库版本
以后要修改数据库模型时的步骤如下:
(1)修改SQLAlchemy Base那边的代码代表的表结构。
(2)执行alembic revision --autogenerate 。。。命令
(3)检查自动生成的脚本,改成不准确的地方。(例如重命名会变成删除再添加,会丢失数据)
(4)执行 alembic upgrade head 把改动应用到数据库
降级或升级数据库
升级到最新前面已经说过了
alembic upgrade head
要指定版本的话,看到前面自动生成的py文件里面有个Revision ID,同时也是py文件的前缀。
使用
alembic downgrade <Revision ID>
alembic upgrade <Revision ID>
参考:
只有注册用户登录后才能发表评论。