我有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
。
现在我需要编写一个将删除约束的迁移。但是考虑到我不知道它的名字,我怎么能参考呢?
您可以使用sqlalchemy中的inspect
方法获取表格详细信息,更多详细信息,请访问here
在inspect
方法中,您可以使用get_foreign_keys
方法获取指定表名的现有外键。从该列表中,您可以通过检查referred_table
的值来查找外键的名称。
希望这可以帮助。
这个答案可能晚了大约4年,但我自己也遇到了这个问题:Alembic会抛出一个名字未知的约束。 以下是一系列解决方案:
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))
'<table>_<column>_fkey
或'fk_<table>_<column>'
。pg_constraints
。如果您使用pgAdmin,则此表位于Servers > [Your server] > Databases > [Your db] > Catalogs > PostgreSQL Catalog (pg_catalog) > Tables > pg_constraints
下。
如果你不能使用GUI工具或想要更精确地查询它,this answer解释了如何做到这一点。