74 lines
2.3 KiB
Python
74 lines
2.3 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
Database initialization and auto-maintenance entrypoint.
|
|
"""
|
|
import os
|
|
import sys
|
|
|
|
|
|
def _project_root() -> str:
|
|
return os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
|
|
|
|
|
PROJECT_ROOT = _project_root()
|
|
if PROJECT_ROOT not in sys.path:
|
|
sys.path.insert(0, PROJECT_ROOT)
|
|
|
|
|
|
from backend.app.config import ensure_project_env_loaded, settings
|
|
|
|
|
|
def main() -> int:
|
|
ensure_project_env_loaded()
|
|
|
|
database_url = settings.DATABASE_URL
|
|
if not database_url:
|
|
print("[ERROR] DATABASE_URL not found in .env")
|
|
return 1
|
|
|
|
from backend.app.db_maintenance import ensure_database_ready
|
|
|
|
print("[*] Validating and maintaining database schema...")
|
|
result = ensure_database_ready(database_url, bootstrap_admin=True, seed_hazard=True)
|
|
|
|
print(f"[*] Database host: {result.get('host')}")
|
|
print(f"[*] Database name: {result.get('database')}")
|
|
if result.get("mismatch_detected"):
|
|
print("[*] Schema mismatch detected and handled.")
|
|
for reason in result.get("mismatch_reasons", []):
|
|
print(f" - {reason}")
|
|
else:
|
|
print("[OK] Database schema already matches ORM metadata.")
|
|
|
|
added_columns = result.get("added_columns", [])
|
|
if added_columns:
|
|
print(f"[OK] Added missing columns ({len(added_columns)}): {added_columns}")
|
|
|
|
if result.get("schema_reset"):
|
|
print("[WARN] Schema was reset because DB_SCHEMA_RESET_ON_MISMATCH and DB_SCHEMA_RESET_CONFIRM are enabled.")
|
|
|
|
if result.get("applied_sql_files"):
|
|
print(f"[OK] Applied SQL maintenance files: {', '.join(result['applied_sql_files'])}")
|
|
|
|
admin_status = result.get("admin") or {}
|
|
if admin_status.get("message"):
|
|
print(f"[OK] {admin_status['message']}")
|
|
|
|
hazard_status = result.get("hazard_seed") or {}
|
|
if hazard_status.get("message"):
|
|
prefix = "[OK]" if hazard_status.get("seeded") or hazard_status.get("count") else "[INFO]"
|
|
print(f"{prefix} {hazard_status['message']}")
|
|
|
|
print("\n========================================")
|
|
print(" Database Initialization Complete! ")
|
|
print("========================================")
|
|
return 0
|
|
|
|
|
|
if __name__ == "__main__":
|
|
try:
|
|
raise SystemExit(main())
|
|
except Exception as exc:
|
|
print(f"\n[CRITICAL ERROR] {exc}")
|
|
raise SystemExit(1)
|