alemic数据库迁移框架的离线扩展

alembic-offline的Python项目详细描述


alembic-offline

https://api.travis-ci.org/paylogic/alembic-offline.pnghttps://pypip.in/v/alembic-offline/badge.pnghttps://coveralls.io/repos/paylogic/alembic-offline/badge.svg?branch=masterDocumentation Status

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

License

本软件在MIT license

请参考license file

版权所有2015 Anatoly Bubenkov,Paylogic International等。

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)

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
线程“awteventque0”java中的图像异常。lang.IllegalArgumentException:宽度(1)和高度(1)不能小于等于0   java JodaTime LocalTime到JSON实际堆栈溢出   java Jfree图表更改Y轴数据   java使用Perlin noise生成二维平铺贴图   java如何检测安卓中是否正在录制屏幕   如何在Android中从本机C/C++调用JavaAPI   java在非本地应用程序中将号码添加到iPhone或Android电话联系人列表   java找到最大的子矩阵   对于“偶数团队”代码,java迭代运行得更快   java Spring引导rest终结点返回null并带有获取请求   java将一个字符串插入到另一个字符串中   java我正在尝试向使用我的应用程序的特定用户广播消息?   来自Yml文件的java Spring引导和属性数据   java Gradle在依赖项中复制类   用于Knime中多行的java正则表达式   java访问来自超类的隐藏变量   java如何调用其他EAR的bean方法   java使用命令行更新哪些可用的驱动程序?   java如何允许其他人通过API向类添加自定义枚举   java Android R8在发送到Firebase时复制自定义模型类的字段