diff --git a/backend/alembic/env.py b/backend/alembic/env.py index 0267b04..1a2bd59 100644 --- a/backend/alembic/env.py +++ b/backend/alembic/env.py @@ -11,7 +11,7 @@ sys.path.insert(0, os.path.dirname(os.path.dirname(__file__))) from app.core.config import settings from app.db.session import Base # Import all models to ensure they are registered with Base -from app.models.ppr import PPRRecord, User, Journal, Airport, Aircraft +from app.models.ppr import PPRRecord, User, Airport, Aircraft # this is the Alembic Config object, which provides # access to the values within the .ini file in use. diff --git a/backend/alembic/versions/002_local_flights.py b/backend/alembic/versions/002_local_flights.py index 9b5f401..d8fe175 100644 --- a/backend/alembic/versions/002_local_flights.py +++ b/backend/alembic/versions/002_local_flights.py @@ -27,27 +27,39 @@ def upgrade() -> None: """ # Modify existing journal table to support all entity types - # First add new columns - op.add_column('journal', sa.Column('entity_type', sa.String(50), nullable=True)) - op.add_column('journal', sa.Column('entity_id', sa.BigInteger(), nullable=True)) + # First add new columns (check if they don't already exist) + from sqlalchemy import inspect, text + from alembic import op + + # Get table columns to check if entity_type and entity_id already exist + connection = op.get_context().bind + inspector = inspect(connection) + columns = [col['name'] for col in inspector.get_columns('journal')] + + if 'entity_type' not in columns: + op.add_column('journal', sa.Column('entity_type', sa.String(50), nullable=True)) + if 'entity_id' not in columns: + op.add_column('journal', sa.Column('entity_id', sa.BigInteger(), nullable=True)) # Migrate existing PPR journal entries: backfill entity_type and entity_id op.execute(""" UPDATE journal SET entity_type = 'PPR', entity_id = ppr_id - WHERE entity_type IS NULL + WHERE entity_type IS NULL AND ppr_id IS NOT NULL """) # Make new columns NOT NULL after migration - op.alter_column('journal', 'entity_type', nullable=False) - op.alter_column('journal', 'entity_id', nullable=False) + op.alter_column('journal', 'entity_type', existing_type=sa.String(50), nullable=False) + op.alter_column('journal', 'entity_id', existing_type=sa.BigInteger(), nullable=False) # Make ip column nullable (new entries won't always have it) op.alter_column('journal', 'ip', existing_type=sa.String(45), nullable=True) - # Drop the old ppr_id column - op.drop_column('journal', 'ppr_id') + # Drop the foreign key constraint before dropping the column + if 'ppr_id' in columns: + op.drop_constraint('journal_ibfk_1', 'journal', type_='foreignkey') + op.drop_column('journal', 'ppr_id') # Add composite index for efficient queries op.create_index('idx_entity_lookup', 'journal', ['entity_type', 'entity_id']) diff --git a/backend/entrypoint.sh b/backend/entrypoint.sh index 3c86422..0151478 100644 --- a/backend/entrypoint.sh +++ b/backend/entrypoint.sh @@ -125,17 +125,23 @@ elif [ $DB_STATE -eq 0 ]; then echo "Checking for pending migrations..." cd /app - # Get current and head revisions - CURRENT=$(alembic current 2>/dev/null | grep -o '[a-f0-9]\{12\}' | head -1 || echo "none") - HEAD=$(alembic heads 2>/dev/null | grep -o '[a-f0-9]\{12\}' | head -1 || echo "none") + # Get current and head revisions (handle both hash and named revisions) + CURRENT=$(alembic current 2>/dev/null | tail -1 | awk '{print $NF}' || echo "none") + HEAD=$(alembic heads 2>/dev/null | tail -1 | awk '{print $NF}' || echo "none") + + echo " Current: $CURRENT" + echo " Target: $HEAD" if [ "$CURRENT" != "$HEAD" ] && [ "$HEAD" != "none" ]; then echo "✓ Pending migrations detected" - echo " Current: $CURRENT" - echo " Target: $HEAD" echo "Applying migrations..." alembic upgrade head - echo "✓ Migrations applied" + if [ $? -eq 0 ]; then + echo "✓ Migrations applied successfully" + else + echo "✗ Migration failed" + exit 1 + fi else echo "✓ Database is up to date" fi