gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 07:44:34 26 4
gpt4 key购买 nike

我有 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

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

最佳答案

这个答案可能晚了大约 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解释了如何操作。

关于mysql - 如何删除没有名称定义的约束?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28194665/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com