Development Migration Runner
This document provides an example run_dev_migrations.py wrapper script. It runs Alembic commands against a development database by selecting the correct database URL and setting a consistent environment context.
Usage
# Show current revision
PYTHONPATH=. python migrations/run_dev_migrations.py current
# Show revision history
PYTHONPATH=. python migrations/run_dev_migrations.py history
# Upgrade to latest revision
PYTHONPATH=. python migrations/run_dev_migrations.py upgrade head
# Create a new revision (auto-generated from model changes)
PYTHONPATH=. python migrations/run_dev_migrations.py revision --autogenerate -m "Add new table"
Script Implementation
Save this file as migrations/run_dev_migrations.py.
import os
import subprocess
import sys
import logging
from dotenv import load_dotenv
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger("migrations.run_dev_migrations")
# Load environment variables from .env (optional but convenient for local usage)
load_dotenv(override=True)
APP_ENV = "development"
os.environ["ENVIRONMENT"] = APP_ENV
# Select the dev database URL and expose it for Alembic.
# Use whatever naming convention your project adopts; keep it consistent across environments.
dev_url = os.getenv("DATABASE_URL_DEV")
if not dev_url:
logger.error("DATABASE_URL_DEV is not set. Cannot continue.")
sys.exit(1)
os.environ["DATABASE_URL"] = dev_url
logger.info("Using development database URL (ENVIRONMENT=%s)", APP_ENV)
if len(sys.argv) < 2:
logger.info("Usage: python migrations/run_dev_migrations.py <alembic-args...>")
logger.info("Examples:")
logger.info(" python migrations/run_dev_migrations.py current")
logger.info(" python migrations/run_dev_migrations.py upgrade head")
logger.info(' python migrations/run_dev_migrations.py revision --autogenerate -m "Add new table"')
sys.exit(1)
# Pass through to Alembic so all Alembic commands are supported.
subprocess.run(["alembic", *sys.argv[1:]], check=True)