期望
支持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_1
,tenant_2
。每个租户都将在同一个Postgres DB中创建自己的模式,并有一个模式来维护所有租户之间的共享表。每个租户模式将具有完全相同的表。
因此,用例是我们在models.py
中拥有的任何模型都应该在所有租户模式中创建。因此,必须在tenant_1
和tenant_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.users
、tenant_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 ###
有人能帮忙完成这件事吗?
1条答案
按热度按时间g6ll5ycj1#
我会查看include_name和include_object。前者允许您指定要应用迁移的架构。