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.
现在我需要编写一个迁移来删除约束。但考虑到我不知道它的名字,我该如何引用它呢?
这个答案可能晚了大约 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)
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 工具或想要更精确地查询它,此答案解释了如何操作。
| 归档时间: |
|
| 查看次数: |
7682 次 |
| 最近记录: |