#!/usr/bin/env python3 """ Database Initialization Script Creates all tables and seeds initial data for MediLens """ import asyncio import os import sys from pathlib import Path # Add backend to path backend_dir = Path(__file__).parent.parent sys.path.insert(0, str(backend_dir)) # Load .env file manually env_file = backend_dir / ".env" if env_file.exists(): with open(env_file, 'r') as f: for line in f: line = line.strip() if line and not line.startswith('#') and '=' in line: key, value = line.split('=', 1) # Remove surrounding quotes if present value = value.strip().strip("'").strip('"') os.environ[key] = value from app.database import db from app.database.models import Role async def init_database(): """Initialize database with tables and seed data""" print("=" * 60) print("MediLens Database Initialization") print("=" * 60) # Initialize database connection print("\n[1/3] Connecting to Neon Postgres...") db.initialize() print("✓ Connected") # Create all tables print("\n[2/3] Creating database schema...") await db.create_all_tables() print("✓ Schema created") # Seed initial data print("\n[3/3] Seeding initial data...") async with db.session_scope() as session: # Check if roles exist from sqlalchemy import select result = await session.execute(select(Role)) existing_roles = result.scalars().all() if not existing_roles: # Create default roles roles = [ Role( name='patient', description='Standard patient user', permissions=['view_own_assessments', 'create_assessment', 'chat'] ), Role( name='clinician', description='Healthcare provider', permissions=[ 'view_all_assessments', 'create_assessment', 'review_assessments', 'export_data', 'chat' ] ), Role( name='admin', description='System administrator', permissions=[ 'manage_users', 'manage_organizations', 'view_audit_logs', 'manage_roles', 'all' ] ), Role( name='researcher', description='Research access only', permissions=['view_anonymized_data', 'export_data'] ), ] session.add_all(roles) print(f"✓ Created {len(roles)} default roles") else: print(f"✓ Found {len(existing_roles)} existing roles") # Close connection await db.close() print("\n" + "=" * 60) print("✓ Database initialization complete!") print("=" * 60) if __name__ == "__main__": asyncio.run(init_database())