SQLAlchemy 迁移生成具有不同名称的外键。如何放下这些?
SQLAlchemy migrations generating foreign keys with different names. How to drop these?
在我的 SQLAlchemy 数据模型中,我有一个来自 project->customer
的引用。我正在进行迁移,最初这个 FK 是通过
创建的
sa.ForeignKeyConstraint(['customer_id'], ['customers.id'], )
(这是在创建 project
table 的同一迁移期间,因此自动生成的 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 ...文档当然没有提到这是一个好主意。所以...我知道将来如何防止这种情况,但不知道如何解决当前问题。
我最终将其添加到我的迁移中
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 查询
在我的 SQLAlchemy 数据模型中,我有一个来自 project->customer
的引用。我正在进行迁移,最初这个 FK 是通过
sa.ForeignKeyConstraint(['customer_id'], ['customers.id'], )
(这是在创建 project
table 的同一迁移期间,因此自动生成的 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 ...文档当然没有提到这是一个好主意。所以...我知道将来如何防止这种情况,但不知道如何解决当前问题。
我最终将其添加到我的迁移中
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 查询