Spaces:
Running
Running
| """Lightweight schema updates for chat sessions (SQLite/HF compatible).""" | |
| from sqlalchemy import inspect, text | |
| from app.database.database import engine | |
| from app.database.models import ChatSession, ChatMessage | |
| def migrate_chat_schema() -> None: | |
| insp = inspect(engine) | |
| tables = insp.get_table_names() | |
| if "chat_sessions" not in tables: | |
| ChatSession.__table__.create(bind=engine, checkfirst=True) | |
| if "chat_messages" not in tables: | |
| ChatMessage.__table__.create(bind=engine, checkfirst=True) | |
| return | |
| cols = {c["name"] for c in insp.get_columns("chat_messages")} | |
| if "session_id" not in cols: | |
| with engine.begin() as conn: | |
| conn.execute(text("ALTER TABLE chat_messages ADD COLUMN session_id VARCHAR")) | |
| _attach_orphan_messages() | |
| def _attach_orphan_messages() -> None: | |
| from sqlalchemy.orm import Session | |
| from app.database.database import SessionLocal | |
| db = SessionLocal() | |
| try: | |
| orphans = ( | |
| db.query(ChatMessage) | |
| .filter(ChatMessage.session_id.is_(None)) | |
| .all() | |
| ) | |
| if not orphans: | |
| return | |
| by_user: dict[str, list] = {} | |
| for msg in orphans: | |
| by_user.setdefault(msg.user_id, []).append(msg) | |
| for user_id, msgs in by_user.items(): | |
| session = ChatSession(user_id=user_id, title="Previous conversation") | |
| db.add(session) | |
| db.flush() | |
| for m in msgs: | |
| m.session_id = session.id | |
| session.updated_at = msgs[-1].created_at if msgs[-1].created_at else session.updated_at | |
| db.commit() | |
| finally: | |
| db.close() | |