| """Database initialization.""" | |
| from sqlalchemy import text | |
| from src.db.postgres.connection import engine, Base | |
| from src.db.postgres.models import Document, Room, ChatMessage, User | |
| async def init_db(): | |
| """Initialize database tables and required extensions.""" | |
| async with engine.begin() as conn: | |
| # Create pgvector extension using two separate statements. | |
| # Must NOT be combined into one string — asyncpg rejects multi-statement | |
| # prepared statements (langchain_postgres bug workaround via create_extension=False). | |
| await conn.execute(text("SELECT pg_advisory_xact_lock(1573678846307946496)")) | |
| await conn.execute(text("CREATE EXTENSION IF NOT EXISTS vector")) | |
| # Create application tables | |
| await conn.run_sync(Base.metadata.create_all) | |
| # Schema migrations (idempotent — safe to run on every startup) | |
| await conn.execute(text( | |
| "ALTER TABLE rooms ADD COLUMN IF NOT EXISTS status VARCHAR NOT NULL DEFAULT 'active'" | |
| )) | |