dth*_*dor 13 python sqlalchemy alembic
如何使用Alembic --autogenerate
迁移SQL Alchemy模型中未硬编码的多个 Postgres模式?(镜像问题的SQLAlchemy支持Postgres架构,但对于Alembic).
特别是,我们使用Postgres模式来分离共享同一组表的不同客户端.此外,客户端之间存在共享内容的模式.SQL Alchemy模型不了解模式,模式是在运行时使用设置的session.execute("SET search_path TO client1,shared")
.
默认情况下--autogenerate
根本没有帮助,因为它检测到模型中不存在的多个模式,最终删除模式并重新创建默认模式中的每个表.
我真的想使用--autogenerate
正确的管道来正确设置模式.关于Alembic的API是否/如何做到这一点的任何建议?
从问题 409 开始,应用程序到租户特定模式的升级/降级操作可以最容易地使用翻译的模式名称完成,这也是您通常为多租户执行主应用程序的方式。
进入 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()
Run Code Online (Sandbox Code Playgroud)
上面会将“无”模式名称转换为给定的租户名称。如果应用程序与具有全局表的默认架构共享基于租户的架构,那么您将使用诸如“tenant_schema”之类的标记作为符号:
for tenant_schema_name in all_my_tenant_names:
conn = connection.execution_options(schema_translate_map={"tenant_schema": tenant_schema_name}
Run Code Online (Sandbox Code Playgroud)
并在迁移文件中引用“tenant_schema”,其中实际特定于租户的架构名称:
def upgrade():
op.alter_column("some_table", "some_column", <migration options>, schema="tenant_schema")
Run Code Online (Sandbox Code Playgroud)
对于“自动生成”的情况,@nick-retallack 提供的解决方案有更多你会在这方面使用的部分,即使用 include_schemas 以便自动生成只查看代表最新版本的“样本”模式租户特定的架构。
为了设置 env.py 为正确的命令使用正确的系统,可以使用用户定义的选项和migration_context.get_x_argument()来控制行为。
这是一个可行的解决方案:https://gist.github.com/nickretallack/bb8ca0e37829b4722dd1
它仍然要求您在生成每个迁移后编辑模式名称,但至少有趣的工作是由 Alembic 完成的。感谢 Michael Bayer 在邮件列表上提供的帮助。
归档时间: |
|
查看次数: |
4871 次 |
最近记录: |