在 Alembic 降级中删除外键?

Dropping foreign keys in Alembic downgrade?

所以我使用 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')

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

蒂亚。

你只需要调用drop constrain。所以在你的升级方法中你可能有以下内容:

op.create_foreign_key(u'my_fkey', 'table1', 'table2', ['table2_id'], ['id'])

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

op.drop_constraint(u'my_fkey', 'table1', type_='foreignkey')

需要注意的一件事是您在创建外键时分配了一个名称,或者确切知道数据库将使用的命名约定。当您删除约束时,您需要指定所使用的确切名称。

最后一件事可能会帮助您节省时间,那就是使用 alembic 的自动修订功能。我发现这省去了很多繁重的工作,然后我可以根据需要调整脚本。

alembic revision --autogenerate -m <message>

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