SQLAlchemy迁移生成具有不同名称的外键。如何丢弃这些?

时间:2018-12-22 02:32:13

标签: python sqlalchemy alembic sqlalchemy-migrate

在我的SQLAlchemy数据模型中,我有一个来自project->customer的引用。我正在进行迁移,最初,该FK是通过

创建的
sa.ForeignKeyConstraint(['customer_id'], ['customers.id'], )

(这是在创建project表的同一迁移过程中,因此自动生成的down就是drop_table)。

现在我要删除此引用,因此要删除该约束。自动生成的迁移是

op.drop_constraint('FK__projects__custom__412EB0B6', 'projects', type_='foreignkey')

问题在于约束并不总是命名为。在一个数据库中,我检查了名为FK__projects__custom__2E1BDC42的数据库,在另一数据库中,...如何正确删除约束,以及引起名称差异的原因是什么?

编辑: 显然I had the option to name the constraint ...文档当然没有提到这是一个好而必要的想法。所以...我知道将来如何避免这种情况,但不知道如何解决当前问题。

1 个答案:

答案 0 :(得分:1)

我最终将其添加到迁移中

op.execute("""
    DECLARE @fk_project_customer varchar(50);
    SELECT @fk_project_customer = (SELECT name FROM sys.foreign_keys WHERE name LIKE 'FK__projects__custom__%');
    EXEC('ALTER TABLE projects DROP CONSTRAINT "' + @fk_project_customer + '"');
""")

因此,基本上,它按照@@ Ilja的建议从sys.foreign_keys中找到遵循此模式的约束名称,然后从其中EXEC中进行动态sql查询