@@ -580,6 +580,44 @@ def _make_foreign_key(
580580 initially = options .get ("initially" ),
581581 name = params ["name" ],
582582 )
583+
584+ referred_schema = params ["referred_schema" ]
585+ referred_table = params ["referred_table" ]
586+
587+ remote_table_key = sqla_compat ._get_table_key (
588+ referred_table , referred_schema
589+ )
590+ if remote_table_key not in conn_table .metadata :
591+ # create a placeholder table
592+ sa_schema .Table (
593+ referred_table ,
594+ conn_table .metadata ,
595+ schema = (
596+ referred_schema
597+ if referred_schema is not None
598+ else sa_schema .BLANK_SCHEMA
599+ ),
600+ * [
601+ sa_schema .Column (remote , conn_table .c [local ].type )
602+ for local , remote in zip (
603+ params ["constrained_columns" ], params ["referred_columns" ]
604+ )
605+ ],
606+ info = {"alembic_placeholder" : True },
607+ )
608+ elif conn_table .metadata .tables [remote_table_key ].info .get (
609+ "alembic_placeholder"
610+ ):
611+ # table exists and is a placeholder; ensure needed columns are present
612+ placeholder_table = conn_table .metadata .tables [remote_table_key ]
613+ for local , remote in zip (
614+ params ["constrained_columns" ], params ["referred_columns" ]
615+ ):
616+ if remote not in placeholder_table .c :
617+ placeholder_table .append_column (
618+ sa_schema .Column (remote , conn_table .c [local ].type )
619+ )
620+
583621 # needed by 0.7
584622 conn_table .append_constraint (const )
585623 return const
@@ -595,6 +633,7 @@ def _compare_foreign_keys(
595633) -> PriorityDispatchResult :
596634 # if we're doing CREATE TABLE, all FKs are created
597635 # inline within the table def
636+
598637 if conn_table is None or metadata_table is None :
599638 return PriorityDispatchResult .CONTINUE
600639
0 commit comments