nordabiz/scripts/run_migration.py
Maciej Pienczyn 6d1f75bce5 fix(admin): Naprawiono błędne nazwy endpointów w breadcrumbs
Zmieniono admin_dashboard i admin_zopk_dashboard na admin_zopk

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-17 09:03:01 +01:00

92 lines
2.3 KiB
Python

#!/usr/bin/env python3
"""
Run SQL migrations using DATABASE_URL from .env
Usage:
python scripts/run_migration.py database/migrations/016_zopk_milestones.sql
python scripts/run_migration.py database/migrations/*.sql # Run all
"""
import os
import sys
import glob
from pathlib import Path
# Add parent directory to path for imports
sys.path.insert(0, str(Path(__file__).parent.parent))
def load_env():
"""Load .env file from project root"""
env_path = Path(__file__).parent.parent / '.env'
if env_path.exists():
with open(env_path, 'r') as f:
for line in f:
line = line.strip()
if line and not line.startswith('#') and '=' in line:
key, value = line.split('=', 1)
os.environ[key] = value.strip()
if not os.environ.get('DATABASE_URL'):
print("ERROR: DATABASE_URL not found in .env")
sys.exit(1)
def run_migration(sql_file: str) -> bool:
"""Run a single SQL migration file"""
from sqlalchemy import create_engine, text
if not os.path.exists(sql_file):
print(f"ERROR: File not found: {sql_file}")
return False
print(f"Running migration: {sql_file}")
try:
engine = create_engine(os.environ['DATABASE_URL'])
with engine.connect() as conn:
with open(sql_file, 'r') as f:
sql = f.read()
conn.execute(text(sql))
conn.commit()
print(f"{sql_file} - SUCCESS")
return True
except Exception as e:
print(f"{sql_file} - FAILED: {e}")
return False
def main():
if len(sys.argv) < 2:
print(__doc__)
sys.exit(1)
load_env()
# Handle glob patterns
sql_files = []
for arg in sys.argv[1:]:
if '*' in arg:
sql_files.extend(sorted(glob.glob(arg)))
else:
sql_files.append(arg)
if not sql_files:
print("No migration files found")
sys.exit(1)
print(f"Found {len(sql_files)} migration(s) to run\n")
success = 0
failed = 0
for sql_file in sql_files:
if run_migration(sql_file):
success += 1
else:
failed += 1
print(f"\n{'='*50}")
print(f"Results: {success} success, {failed} failed")
sys.exit(0 if failed == 0 else 1)
if __name__ == '__main__':
main()