Skip to content

Commit 7d2211c

Browse files
committed
Allow flexible naming in constraint drop
1 parent 19cbede commit 7d2211c

1 file changed

Lines changed: 23 additions & 4 deletions

File tree

met-api/migrations/versions/45a555233a81_remove_cascade_delete_from_eng_to_.py

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717

1818

1919
def upgrade():
20-
op.drop_constraint('survey_engagement_id_fkey', 'survey', type_='foreignkey')
20+
_drop_matching_foreign_keys('survey', 'engagement_id', 'engagement')
2121
op.create_foreign_key(
2222
'survey_engagement_id_fkey',
2323
'survey',
@@ -27,7 +27,7 @@ def upgrade():
2727
ondelete='SET NULL'
2828
)
2929

30-
op.drop_constraint('widget_widget_type_id_fkey', 'widget', type_='foreignkey')
30+
_drop_matching_foreign_keys('widget', 'widget_type_id', 'widget_type')
3131
op.create_foreign_key(
3232
'widget_widget_type_id_fkey',
3333
'widget',
@@ -39,7 +39,7 @@ def upgrade():
3939

4040

4141
def downgrade():
42-
op.drop_constraint('survey_engagement_id_fkey', 'survey', type_='foreignkey')
42+
_drop_matching_foreign_keys('survey', 'engagement_id', 'engagement')
4343
op.create_foreign_key(
4444
'survey_engagement_id_fkey',
4545
'survey',
@@ -49,7 +49,7 @@ def downgrade():
4949
ondelete='CASCADE'
5050
)
5151

52-
op.drop_constraint('widget_widget_type_id_fkey', 'widget', type_='foreignkey')
52+
_drop_matching_foreign_keys('widget', 'widget_type_id', 'widget_type')
5353
op.create_foreign_key(
5454
'widget_widget_type_id_fkey',
5555
'widget',
@@ -58,3 +58,22 @@ def downgrade():
5858
['id'],
5959
ondelete='CASCADE'
6060
)
61+
62+
63+
def _drop_matching_foreign_keys(table_name, local_column, referred_table):
64+
"""Drop FK constraints for a specific local column and referenced table."""
65+
bind = op.get_bind()
66+
inspector = sa.inspect(bind)
67+
foreign_keys = inspector.get_foreign_keys(table_name)
68+
69+
for foreign_key in foreign_keys:
70+
name = foreign_key.get('name')
71+
constrained_columns = foreign_key.get('constrained_columns') or []
72+
current_referred_table = foreign_key.get('referred_table')
73+
74+
if (
75+
name
76+
and local_column in constrained_columns
77+
and current_referred_table == referred_table
78+
):
79+
op.drop_constraint(name, table_name, type_='foreignkey')

0 commit comments

Comments
 (0)