postgresql 获取Postgres数据库中所有模式的alembic自动生成迁移

6qfn3psc  于 2023-04-29  发布在  PostgreSQL
关注(0)|答案(1)|浏览(106)

期望

支持Postgres多租户使用Schemas与Sqlalchemistry和alembic。

型号
class User(Base):
    __tablename__ = 'users'
    __table_args__ = ({"schema": "test"})

    id = Column(Integer, primary_key=True)
    name = Column(String(80), unique=True, nullable=False)

    def __repr__(self):
        return '<User %r>' % self.name

我们有两个租户tenant_1tenant_2。每个租户都将在同一个Postgres DB中创建自己的模式,并有一个模式来维护所有租户之间的共享表。每个租户模式将具有完全相同的表。
因此,用例是我们在models.py中拥有的任何模型都应该在所有租户模式中创建。因此,必须在tenant_1tenant_2模式中创建users表。
我尝试使用alembic为同一模型的所有模式自动生成迁移。

alembic www.example.com

target_metadata = app.Base.metadata

...

def run_migrations_online() -> None:
    """ Run migrations in 'online' mode.

    In this scenario we need to create an Engine
    and associate a connection with the context.

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

    with connectable.connect() as connection:
        all_my_tenant_names = ["tenant_1", "tenant_2"]

        for tenant_schema_name in all_my_tenant_names:
            conn = connection.execution_options(schema_translate_map={"test": tenant_schema_name})
            print("Migrating tenant schema %s" % tenant_schema_name)

            context.configure(
            connection=conn, target_metadata=target_metadata, include_schemas=True,
            version_table_schema=target_metadata.schema,
        )

            with context.begin_transaction():
                context.execute('SET search_path TO public')
                context.run_migrations()

预期迁移文件将包含用于创建tenant_1.userstenant_2.users表的语句。但它只有一个语句来创建test.users表。

def upgrade() -> None:
    # ### commands auto generated by Alembic - please adjust! ###
    op.create_table('users',
    sa.Column('id', sa.Integer(), nullable=False),
    sa.Column('name', sa.String(length=80), nullable=False),
    sa.PrimaryKeyConstraint('id'),
    sa.UniqueConstraint('name'),
    schema='test'
    )
    op.drop_table('user', schema='tenant_2')
    op.drop_table('alembic_version', schema='tenant_2')
    op.drop_table('user', schema='tenant_1')
    op.drop_table('alembic_version', schema='tenant_1')
    # ### end Alembic commands ###

有人能帮忙完成这件事吗?

g6ll5ycj

g6ll5ycj1#

我会查看include_name和include_object。前者允许您指定要应用迁移的架构。

相关问题