如何删除没有名称的约束?

问题描述 投票:0回答:2

我有Alembic迁移,声明外键约束,如下所示:

op.create_table(
    'that',
    ...
    Column('this_id', String),
    ForeignKeyConstraint(['this_id'], ['this.id'])
    ...
)

我的项目要求支持两个数据库 - PostgreSQL和MySQL。并且由于未定义约束的名称,因此每个数据库都会自动生成它。在MySQL中它看起来像this_ibfk_1和Postgres像that_this_id_key

现在我需要编写一个将删除约束的迁移。但是考虑到我不知道它的名字,我怎么能参考呢?

mysql postgresql sqlalchemy alembic
2个回答
0
投票

您可以使用sqlalchemy中的inspect方法获取表格详细信息,更多详细信息,请访问here

inspect方法中,您可以使用get_foreign_keys方法获取指定表名的现有外键。从该列表中,您可以通过检查referred_table的值来查找外键的名称。

希望这可以帮助。


0
投票

这个答案可能晚了大约4年,但我自己也遇到了这个问题:Alembic会抛出一个名字未知的约束。 以下是一系列解决方案:

  • 获取一个SQLAlchemy Table对象来操作:
from alembic import op
from sqlalchemy import Table, MetaData

meta = MetaData(bind=op.get_bind())
my_table = Table('my_table_name', meta)

my_table_constraints = list(my_table.constraints)

您桌面上的所有约束现在都列在my_table_constraints中。得到他们的名字:

my_constraint_names = list(map(lambda x: x.name, my_table_constraints))
  • “猜测”你的约束的名称。对于Postgres数据库,它很可能是'<table>_<column>_fkey'fk_<table>_<column>'
  • 对于Postgres数据库,请检查目录表的内容。你感兴趣的表是pg_constraints。如果您使用pgAdmin,则此表位于Servers > [Your server] > Databases > [Your db] > Catalogs > PostgreSQL Catalog (pg_catalog) > Tables > pg_constraints下。 如果你不能使用GUI工具或想要更精确地查询它,this answer解释了如何做到这一点。
© www.soinside.com 2019 - 2024. All rights reserved.