Files
bakery-ia/services/inventory/migrations/apply_indexes.py
2025-11-15 21:21:06 +01:00

104 lines
2.7 KiB
Python
Executable File

#!/usr/bin/env python3
"""
Script to apply performance indexes to the inventory database
Usage: python apply_indexes.py
"""
import asyncio
import os
import sys
from pathlib import Path
# Add parent directory to path to import app modules
sys.path.insert(0, str(Path(__file__).parent.parent))
from sqlalchemy import text
from app.core.database import database_manager
import structlog
logger = structlog.get_logger()
async def apply_indexes():
"""Apply performance indexes from SQL file"""
try:
# Read the SQL file
sql_file = Path(__file__).parent / "001_add_performance_indexes.sql"
with open(sql_file, 'r') as f:
sql_content = f.read()
logger.info("Applying performance indexes...")
# Split by semicolons and execute each statement
statements = [s.strip() for s in sql_content.split(';') if s.strip() and not s.strip().startswith('--')]
async with database_manager.get_session() as session:
for statement in statements:
if statement:
logger.info(f"Executing: {statement[:100]}...")
await session.execute(text(statement))
await session.commit()
logger.info(f"Successfully applied {len(statements)} index statements")
return True
except Exception as e:
logger.error(f"Failed to apply indexes: {e}", exc_info=True)
return False
async def verify_indexes():
"""Verify that indexes were created"""
try:
logger.info("Verifying indexes...")
verify_query = """
SELECT
schemaname,
tablename,
indexname,
indexdef
FROM pg_indexes
WHERE indexname LIKE 'idx_%'
AND schemaname = 'public'
ORDER BY tablename, indexname;
"""
async with database_manager.get_session() as session:
result = await session.execute(text(verify_query))
indexes = result.fetchall()
logger.info(f"Found {len(indexes)} indexes:")
for idx in indexes:
logger.info(f" {idx.tablename}.{idx.indexname}")
return True
except Exception as e:
logger.error(f"Failed to verify indexes: {e}", exc_info=True)
return False
async def main():
"""Main entry point"""
logger.info("Starting index migration...")
# Apply indexes
success = await apply_indexes()
if success:
# Verify indexes
await verify_indexes()
logger.info("Index migration completed successfully")
else:
logger.error("Index migration failed")
sys.exit(1)
# Close database connections
await database_manager.close_connections()
if __name__ == "__main__":
asyncio.run(main())