在Alembic降级外键?

pur*_*aut 8 python sqlalchemy alembic

所以我使用Alembic迁移在我的数据库中创建了许多表,每个表都有一个索引和一个或两个外键.

我的升级方法工作正常,执行并创建表.

在我删除索引然后删除表之后,我的降级方法失败了.我相信我还必须先放下我的外键吗?但是,我无法弄清楚如何从Alembic文档中删除外键.

降级方法:

def downgrade():
    # Drop Indexes
    op.drop_index('ix_charge_id')
    op.drop_index('ix_statutory_provision_id')
    op.drop_index('ix_originating_authority_id')

    # Drop Tables
    op.drop_table('charge')
    op.drop_table('statutory_provision')
    op.drop_table('originating_authority')
Run Code Online (Sandbox Code Playgroud)

这三个表中的每一个都有一个外键,那么我该如何首先删除它们呢?

TYIA.

Mr-*_*r-F 13

你只需要调用drop约束.因此,在升级方法中,您可能具有以下内容:

op.create_foreign_key(u'my_fkey', 'table1', 'table2', ['table2_id'], ['id'])
Run Code Online (Sandbox Code Playgroud)

然后在你的降级方法中你只需要

op.drop_constraint(u'my_fkey', 'table1', type_='foreignkey')
Run Code Online (Sandbox Code Playgroud)

需要注意的一件事是,在创建外键时指定名称,或者确切地知道数据库将使用的命名约定.删除约束时,需要指定正在使用的名称.

可能有助于节省时间的最后一件事是使用alembic的自动修订功能.我发现这可以节省很多繁重的工作,然后我可以根据需要调整脚本.

alembic revision --autogenerate -m <message>
Run Code Online (Sandbox Code Playgroud)

查看http://alembic.zzzcomputing.com/en/latest/autogenerate.html以获取有关自动生成的更多信息,但它确实节省了时间.