在Alembic降级外键?

时间:2017-03-20 19:01:56

标签: 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')

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

TYIA。

1 个答案:

答案 0 :(得分:9)

你只需要调用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以获取有关自动生成的更多信息,但这确实可以节省时间。