#!/usr/bin/env python3 """ Database initialization script Creates all tables in the PostgreSQL database. Usage: python scripts/init_db.py """ import asyncio import os import sys from pathlib import Path # Scripts live in /scripts; app code and .env live in /backend BACKEND_DIR = Path(__file__).resolve().parent.parent / "backend" sys.path.insert(0, str(BACKEND_DIR)) os.chdir(BACKEND_DIR) from app.database import init_db, close_db, engine from app.config import settings from sqlalchemy import text import logging logging.basicConfig( level=logging.INFO, format="%(asctime)s - %(name)s - %(levelname)s - %(message)s" ) logger = logging.getLogger(__name__) async def main(): """Initialize database""" logger.info("=" * 60) logger.info("Cosmo Database Initialization") logger.info("=" * 60) logger.info(f"Database URL: {settings.database_url.split('@')[1]}") # Hide password logger.info("=" * 60) try: # Test database connection logger.info("Testing database connection...") async with engine.begin() as conn: await conn.execute(text("SELECT 1")) logger.info("āœ“ Database connection successful") # Create all tables logger.info("Creating database tables...") await init_db() logger.info("āœ“ All tables created successfully") # Display created tables async with engine.connect() as conn: result = await conn.execute(text(""" SELECT table_name FROM information_schema.tables WHERE table_schema = 'public' ORDER BY table_name """)) tables = [row[0] for row in result] logger.info(f"\nCreated {len(tables)} tables:") for table in tables: logger.info(f" - {table}") logger.info("\n" + "=" * 60) logger.info("Database initialization completed successfully!") logger.info("=" * 60) except Exception as e: logger.error(f"\nāœ— Database initialization failed: {e}") logger.error("\nPlease ensure:") logger.error(" 1. PostgreSQL is running") logger.error(" 2. Database 'cosmo_db' exists") logger.error(" 3. Database credentials in .env are correct") sys.exit(1) finally: await close_db() if __name__ == "__main__": asyncio.run(main())