alemic数据库迁移框架的离线扩展
alembic-offline的Python项目详细描述
alembic-offline
alembic offline是alemic的扩展,用于丰富迁移的脱机功能
内容
Usage
Phased migrations
alembic offline引入了一个助手,它允许实现分阶段迁移,例如 分为逻辑阶段。例如,您可以在代码部署和 那些在后面。
在alembic配置文件(主部分)中:
phases = before-deploy after-deploy final default-phase = after-deploy
在您的版本文件中:
fromsqlalchemyimportINTEGER,VARCHAR,NVARCHAR,TIMESTAMP,Column,funcfromalembicimportopfromalembic_offlineimportphased,execute_scriptfromtests.migrations.scriptsimportscriptrevision='1'down_revision=None@phaseddefupgrade():op.create_table('account',Column('id',INTEGER,primary_key=True),Column('name',VARCHAR(50),nullable=False),Column('description',NVARCHAR(200)),Column('timestamp',TIMESTAMP,server_default=func.now()))yieldop.execute("update account set name='some'")yieldexecute_script(script.__file__)defdowngrade():pass
将给出sql输出(对于sqlite):
-- Running upgrade -> 1 -- PHASE::before-deploy::; CREATETABLEaccount(idINTEGERNOTNULL,nameVARCHAR(50)NOTNULL,descriptionNVARCHAR(200),timestampTIMESTAMPDEFAULTCURRENT_TIMESTAMP,PRIMARYKEY(id));-- PHASE::after-deploy::; updateaccountsetname='some';-- PHASE::final::; -- SCRIPT::scripts/script.py::; INSERTINTOalembic_version(version_num)VALUES('1');
如您所见,阶段被呈现为sql注释以划分迁移步骤,因此执行迁移的 可以看到它是哪个阶段的步骤。 但是,如果迁移过程是高度自定义的,则可以使用下面描述的alembic脱机api。 获取迁移数据以特殊形式返回迁移阶段,以便您可以自动执行它们。
Arbitrary script as operation
对于复杂的迁移,仅执行sql是不够的,您可能需要执行一些脚本。 为此,有一项特别行动:
fromalembic_offlineimportexecute_scriptdefupgrade():execute_script('scripts/script.py')
如果您得到迁移sql,它将被呈现为sql注释:
-- SCRIPT::scripts/script.py::;
对于那些执行迁移的人,它将是可见的,他们可以手动执行脚本。 但是,如果迁移过程是高度自定义的,则可以使用下面描述的alembic脱机api。 获取迁移数据以特殊形式返回脚本迁移步骤,以便您可以自动执行这些步骤。 对于联机模式,脚本将作为子进程通过pythonsubprocess模块执行。
Get migration data
alembic offline提供了专门的api,可以将某些迁移数据作为字典获取:
fromalembic_offlineimportget_migration_datafromalemic.configimportConfigconfig=Config('path to alemic.ini')data=get_migration_data(config,'your-revision')assertdata=={'revision':'your-revision','phases':{'after-deploy':[{'type':'mysql','script':'alter table account add column name VARCHAR(255)'},{'type':'python','script':'from app.models import Session, Account; Session.add(Account()); Session.commit()','path':'scripts/my_script.py'},]}}
获取迁移数据需要同时设置阶段和默认阶段配置选项。 默认阶段需要能够获取迁移数据,即使对于没有阶段的简单迁移也是如此。
Get migration data in batch
alembic offline提供一个api调用,以获取所有修订版的迁移数据:
fromalembic_offlineimportget_migrations_datafromalemic.configimportConfigconfig=Config('path to alemic.ini')data=get_migrations_data(config)assertdata==[{'revision':'your-revision','phases':{'after-deploy':[{'type':'mysql','script':'alter table account add column name VARCHAR(255)'},{'type':'python','script':'from app.models import Session, Account; Session.add(Account()); Session.commit()','path':'scripts/my_script.py'},]}}]
Command line utilities
因为对于alembic修订版,有时很难找到正确的向下修订版;特别是 当有多个磁头时,我们添加了alembic offline graph命令。
graph命令将生成 然后,可以将此文件的修订转换为图像,以便于可视化。
用法:
alembic-offline graph --filename revisions.dot --alembic-config path/to/alembic.ini
如果安装了graphviz,则可以运行:
dot -Tpng -o revisions.png revisions.dot
生成PNG图像。
Contact
如果您有问题、错误报告、建议等,请在 这是GitHub project page。
Changelog
1.2.0
- 添加迁移依赖树生成命令(hvdklaw)
1.1.0
- 将修订添加到迁移数据(bubenkoff)
- 反向迁移顺序以简化应用程序(bubenkoff)
1.0.5
- 正确处理多阶段偏移数据提取(bubenkoff)
1.0.4
- 已实现联机脚本执行(bubenkoff)
- 获取迁移数据api(bubenkoff)
1.0.3
- 添加了任意脚本操作(bubenkoff)
- 阶段迁移装饰器的严格阶段配置断言(bubenkoff)
- 获取迁移数据api(bubenkoff)
1.0.0
- 首次公开发行(bubenkoff)