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