1717
1818
1919def 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
4141def 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