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

Gil*_*tes 9 mysql postgresql sqlalchemy alembic

我有 Alembic 迁移,它声明了这样的外键约束:

op.create_table(
    'that',
    ...
    Column('this_id', String),
    ForeignKeyConstraint(['this_id'], ['this.id'])
    ...
)
Run Code Online (Sandbox Code Playgroud)

我的项目需要支持两个数据库——PostgreSQL 和 MySQL。由于约束的名称没有定义,每个数据库都会自动生成它。在 MySQL 中它看起来像this_ibfk_1,在 Postgres 中看起来像that_this_id_key.

现在我需要编写一个迁移来删除约束。但考虑到我不知道它的名字,我该如何引用它呢?

deq*_*yra 6

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

  • 获取要操作的 SQLAlchemyTable对象:
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)
Run Code Online (Sandbox Code Playgroud)

表上的所有约束现在都列在 中my_table_constraints。要获取他们的名字:

my_constraint_names = list(map(lambda x: x.name, my_table_constraints))
Run Code Online (Sandbox Code Playgroud)
  • “猜测”你的约束的名称。对于 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 工具或想要更精确地查询它,此答案解释了如何操作。


JRa*_*jan 4

您可以使用inspectsqlalchemy 中的方法来获取表详细信息,更多详细信息请参见此处

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

希望这可以帮助。