Модификация схемы ForeignKeyConstraint в постобработке Alembic - PullRequest
1 голос
/ 19 июня 2019

Я использую process_revision_directives , чтобы применить некоторую постобработку операций, сгенерированных для эталонной схемы. Единственное, на чем я застрял - это удаление схемы postgres из инструкций, поэтому ее можно изменить во время выполнения, используя ответ из другого вопроса .

Приведенный ниже код корректно удаляет схему из операций, за исключением ForeignKeyConstraints в CreateTableOp.

def process_foreign_key(col: sa.ForeignKeyConstraint):
    col.referred_table.schema = None  # Doesn't work


def process_revision_directives(context, revision, directives):
    # Remove the schema from the generated operations
    for op in chain(directives[0].upgrade_ops.ops, directives[0].downgrade_ops.ops):
        if isinstance(op, ops.CreateTableOp):
            op.columns = [
                process_foreign_key(col) if isinstance(col, sa.ForeignKeyConstraint) else col
                for col in op.columns
            ]
        op.schema = None

В настоящее время генерируется вывод, подобный

op.create_table('user',
    sa.Column('id', sa.Integer, nullable=False),
    sa.ForeignKeyConstraint(['id'], ['reference_schema.group.id'], name='group_group_id', onupdate='CASCADE', ondelete='CASCADE'),
)

Есть идеи, как мне изменить эти объекты ограничения, чтобы в целевой таблице не было reference_schema.?

1 Ответ

1 голос
/ 21 июня 2019

Если вы посмотрите в цепочку рендеринга, вы сможете найти, где находится последняя ссылка на схему. Он на op._orig_table, но главное, что он на этом столе дважды.

Включите в цикл for следующее.

op._orig_table.schema = None
op._orig_table = op._orig_table.tometadata(clear_meta)

где clear_meta - это объект MetaData без схемы, например

clear_meta = sa.MetaData(bind=session.connection(), schema=None)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...