import logging
from app.db.session import engine
from sqlalchemy import text, inspect
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
def run_migrations():
"""
Checks for missing columns and adds them if necessary.
This is a simple idempotent migration system to handle schema updates.
"""
logger.info("Starting database migrations...")
with engine.connect() as conn:
inspector = inspect(engine)
if not inspector.has_table("messages"):
logger.info("Table 'messages' does not exist, skipping migrations (will be handled by Base.metadata.create_all).")
return
columns = [c["name"] for c in inspector.get_columns("messages")]
# List of (column_name, column_type) to ensure existence
required_columns = [
("audio_path", "TEXT"),
("model_response_time", "INTEGER"),
("token_count", "INTEGER")
]
for col_name, col_type in required_columns:
if col_name not in columns:
logger.info(f"Adding column '{col_name}' to 'messages' table...")
try:
conn.execute(text(f"ALTER TABLE messages ADD COLUMN {col_name} {col_type}"))
conn.commit()
logger.info(f"Successfully added '{col_name}'.")
except Exception as e:
logger.error(f"Failed to add column '{col_name}': {e}")
else:
logger.info(f"Column '{col_name}' already exists in 'messages'.")
# Session table migrations
session_columns = [c["name"] for c in inspector.get_columns("sessions")]
session_required_columns = [
("stt_provider_name", "TEXT"),
("tts_provider_name", "TEXT")
]
for col_name, col_type in session_required_columns:
if col_name not in session_columns:
logger.info(f"Adding column '{col_name}' to 'sessions' table...")
try:
conn.execute(text(f"ALTER TABLE sessions ADD COLUMN {col_name} {col_type}"))
conn.commit()
logger.info(f"Successfully added '{col_name}'.")
except Exception as e:
logger.error(f"Failed to add column '{col_name}': {e}")
else:
logger.info(f"Column '{col_name}' already exists in 'sessions'.")
logger.info("Database migrations complete.")
if __name__ == "__main__":
run_migrations()