编程语言
首页 > 编程语言> > python – Alembic支持多个Postgres模式

python – Alembic支持多个Postgres模式

作者:互联网

如何使用Alembic的–autogenerate迁移SQL Alchemy模型中未硬编码的多个Postgres模式? (镜像问题SQLAlchemy support of Postgres Schemas,但对于Alembic).

特别是,我们使用Postgres模式来分离共享同一组表的不同客户端.此外,客户端之间存在共享内容的模式. SQL Alchemy模型不了解模式,使用session.execute(“SET search_path TO client1,shared”)在运行时设置模式.

默认的–autogenerate根本没有帮助,因为它检测模型中不存在的多个模式,最终删除模式并重新创建默认模式中的每个表.

我真的想使用–autogenerate,使用正确的管道来正确设置模式.关于Alembic的API是否/如何做到这一点的任何建议?

解决方法:

issue 409开始,使用translated schema names可以很容易地完成升级/降级操作的租户特定模式的应用程序,这也是您通常在多租户中执行主应用程序的方式.

进入env.py:

def run_migrations_online():

    connectable = engine_from_config(
        config.get_section(config.config_ini_section),
        prefix='sqlalchemy.',
        poolclass=pool.NullPool)

    with connectable.connect() as connection:
        for tenant_schema_name in all_my_tenant_names:
             conn = connection.execution_options(schema_translate_map={None: tenant_schema_name}

            logger.info("Migrating tenant schema %s" % tenant_schema_name)
            context.configure(
                connection=conn,
                target_metadata=target_metadata
            )

            # to do each tenant in its own transaction.
            # move this up to do all tenants in one giant transaction
            with context.begin_transaction():
                context.run_migrations()

以上将“无”架构名称转换为给定的租户名称.如果应用程序使用具有全局表的默认架构共享基于租户的架构,那么您将使用某些令牌(如“tenant_schema”)作为符号:

for tenant_schema_name in all_my_tenant_names:
     conn = connection.execution_options(schema_translate_map={"tenant_schema": tenant_schema_name}

在迁移文件中,请参阅“tenant_schema”,其中实际的特定于租户的模式名称为:

def upgrade():
    op.alter_column("some_table", "some_column", <migration options>, schema="tenant_schema")

对于“自动生成”的情况,解决方案@ nick-retallack提供了一些你将在这一端使用的部分,即使用include_schemas,以便autogenerate只查看代表最新版本的“标本”模式.特定于租户的架构.

为了设置env.py以使用正确的系统来执行正确的命令,可以使用migration_context.get_x_argument()的用户定义选项来控制行为.

标签:python,sqlalchemy,alembic
来源: https://codeday.me/bug/20191005/1855645.html