#!/usr/bin/env python3 """ TK-MP-Project 자동 DB 마이그레이션 스크립트 배포 시 백엔드 시작 전에 자동으로 실행되어 DB 스키마를 동기화 """ import sys import os import time from datetime import datetime # 백엔드 모듈 경로 추가 sys.path.append(os.path.join(os.path.dirname(__file__), '..')) def wait_for_db(): """데이터베이스 연결 대기""" max_retries = 30 retry_count = 0 while retry_count < max_retries: try: from app.database import engine # 간단한 연결 테스트 with engine.connect() as conn: conn.execute("SELECT 1") print("✅ 데이터베이스 연결 성공") return True except Exception as e: retry_count += 1 print(f"⏳ 데이터베이스 연결 대기 중... ({retry_count}/{max_retries})") time.sleep(2) print("❌ 데이터베이스 연결 실패") return False def sync_database_schema(): """데이터베이스 스키마 동기화""" try: from app.models import Base from app.database import engine print("🔄 데이터베이스 스키마 동기화 중...") # 모든 테이블 생성/업데이트 Base.metadata.create_all(bind=engine) print("✅ 데이터베이스 스키마 동기화 완료") return True except Exception as e: print(f"❌ 스키마 동기화 실패: {str(e)}") return False def ensure_required_data(): """필수 데이터 확인 및 생성""" try: from app.database import get_db from app.auth.models import User from sqlalchemy.orm import Session print("🔄 필수 데이터 확인 중...") db = next(get_db()) # 관리자 계정 확인 admin_user = db.query(User).filter(User.username == 'admin').first() if not admin_user: print("📝 기본 관리자 계정 생성 중...") admin_user = User( username='admin', password='$2b$12$ld4LDOW5mxkiRQEkXfMUIep/aIzFleQZ4yoL10ZQkUxGqnkYuhNMW', # admin123 name='시스템 관리자', email='admin@tkmp.com', role='admin', access_level='admin', department='IT', position='시스템 관리자', status='active' ) db.add(admin_user) db.commit() print("✅ 기본 관리자 계정 생성 완료") db.close() print("✅ 필수 데이터 확인 완료") return True except Exception as e: print(f"❌ 필수 데이터 확인 실패: {str(e)}") return False def main(): """메인 실행 함수""" print("🚀 TK-MP-Project 자동 DB 마이그레이션 시작") print(f"⏰ 시작 시간: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}") # 1. 데이터베이스 연결 대기 if not wait_for_db(): sys.exit(1) # 2. 스키마 동기화 if not sync_database_schema(): sys.exit(1) # 3. 필수 데이터 확인 if not ensure_required_data(): sys.exit(1) print("🎉 자동 DB 마이그레이션 완료!") print(f"⏰ 완료 시간: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}") if __name__ == "__main__": main()