【问题标题】:Dropping foreign keys in Alembic downgrade?在 Alembic 降级中删除外键?
【发布时间】:2017-08-12 05:18:38
【问题描述】:

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

【问题讨论】:

标签: python sqlalchemy alembic


【解决方案1】:

您只需要调用丢弃约束。因此,在您的升级方法中,您可能有以下内容:

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 了解有关自动生成的更多信息,但这确实可以节省时间。

【讨论】:

  • 有什么方法可以从我以前的版本中恢复没有外键的名称?
  • @remram 如果您没有分配一个,那么数据库引擎应该会自动为您分配一个。您需要找出这是什么,然后更新 alembic 脚本以使用该值。希望对您有所帮助。
  • 显然,如果使用 SQLite,情况并非如此。在这种情况下,Alembic 中有一个解决方法,记录在这里:alembic.zzzcomputing.com/en/latest/…
  • 查看约束名称使用sql tableplus.io/blog/2018/08/…
  • @Mr-F 从你的例子来看,table2.table2_id 似乎引用了table1.id,对吗?如果是这样,drop_constraint 呼叫不应该在table2 上而不是table1 上吗?
猜你喜欢
  • 1970-01-01
  • 2017-11-06
  • 2020-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多