python - SQLAlchemy 迁移生成具有不同名称的外键。怎么丢掉这些呢?

标签 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 ...文档当然没有提到这是一个好的且必要的想法。所以...我知道如何防止将来发生这种情况,但不知道如何解决当前问题。

最佳答案

我最终将其添加到我的迁移中

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查询

关于python - SQLAlchemy 迁移生成具有不同名称的外键。怎么丢掉这些呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53892623/

相关文章:

Python 守护进程打包最佳实践

python - Pandas - 按组成员编号排序

Python 如何检测我是否迭代了列表中的新项目?

python - Numpy:给定索引,如何以有效的方式消除沿 axis=1 的最小值?

python - 如何使用 SQLAlchemy + PostgreSQL 删除自定义类型?

python - Pandas :如何识别具有 dtype 对象但混合类型项目的列?

alembic - 如何修复 alembic 的 "Requested revision overlaps with other requested revisions"?

python - 为什么 SQLAlchemy 不创建串行列?

sqlalchemy - Alembic 不制作复合主键

python - Alembic + Sqlalchemy 多列唯一约束