跳转到主要内容

Alembic数据库迁移框架的离线扩展,用于SQLAlchemy

项目描述

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

alembic-offline是Alembic的一个扩展,用于增强SQLAlchemy迁移的离线功能

用法

分阶段迁移

alembic-offline 引入了一个辅助工具,允许实现分阶段迁移,例如那些步骤被划分为逻辑阶段的迁移。例如,您可以在代码部署前执行某些步骤,在部署后执行其他步骤。

在您的 alembic 配置文件(主部分)

phases = before-deploy after-deploy final
default-phase = after-deploy

在您的版本文件

from sqlalchemy import INTEGER, VARCHAR, NVARCHAR, TIMESTAMP, Column, func
from alembic import op

from alembic_offline import phased, execute_script

from tests.migrations.scripts import script

revision = '1'
down_revision = None


@phased
def upgrade():

    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())
    )
    yield
    op.execute("update account set name='some'")
    yield
    execute_script(script.__file__)


def downgrade():
    pass

将生成 SQL 输出(适用于 sqlite)

-- Running upgrade  -> 1

-- PHASE::before-deploy::;

CREATE TABLE account (
    id INTEGER NOT NULL,
    name VARCHAR(50) NOT NULL,
    description NVARCHAR(200),
    timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (id)
);

-- PHASE::after-deploy::;

update account set name='some';

-- PHASE::final::;

-- SCRIPT::scripts/script.py::;

INSERT INTO alembic_version (version_num) VALUES ('1');

如您所见,阶段被渲染为 SQL 注释以分隔迁移步骤,因此执行迁移的人可以看到它是哪个阶段的步骤。然而,如果迁移过程高度定制化,您可以使用以下描述的 alembic-offline API。 get_migration_data 以特殊形式返回迁移阶段,以便您可以自动化它们的执行。

任意脚本作为操作

对于复杂的迁移,仅执行 SQL 不足以完成,您可能还需要执行某些脚本。为此,存在特殊操作

from alembic_offline import execute_script

def upgrade():
    execute_script('scripts/script.py')

如果您获取到迁移 SQL,它将以 SQL 注释的形式呈现

-- SCRIPT::scripts/script.py::;

对于执行迁移的人来说,它是可见的,他们可以手动执行脚本。然而,如果迁移过程高度定制化,您可以使用以下描述的 alembic-offline API。 get_migration_data 以特殊形式返回脚本迁移步骤,以便您可以自动化它们的执行。对于在线模式,脚本将通过 Python subprocess 模块作为子进程执行。

获取迁移数据

alembic-offline 提供了专门的 API 来以字典形式获取某些迁移数据

from alembic_offline import get_migration_data

from alembic.config import Config

config = Config('path to alembic.ini')

data = get_migration_data(config, 'your-revision')

assert data == {
    '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 需要设置 phasesdefault-phase 配置选项。需要 default-phase 以便即使在没有阶段的简单迁移中也能获取迁移数据。

批量获取迁移数据

alembic-offline 提供了一个 API 调用来获取所有修订版本的迁移数据

from alembic_offline import get_migrations_data

from alembic.config import Config

config = Config('path to alembic.ini')

data = get_migrations_data(config)

assert data == [
    {
        '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'
                },
            ]
        }
    }
]

联系方式

如果您有任何问题、错误报告、建议等,请在 GitHub 项目页面 上创建问题。

许可协议

本软件遵循 MIT 许可协议

© 2015 Anatoly Bubenkov, Paylogic International 及其他人。

项目详情


下载文件

下载适合您平台的文件。如果您不确定选择哪个,请了解有关 安装包 的更多信息。

源代码分发

alembic_offline-2.0.0.tar.gz (10.0 kB 查看哈希值)

上传时间 源代码

构建分发

alembic_offline-2.0.0-py3-none-any.whl (6.7 kB 查看哈希值)

上传时间 Python 3

由以下机构支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面