| """ |
| Database Models & Setup |
| |
| Defines SQLAlchemy ORM models for storing image records and generation history. |
| Uses async SQLite via aiosqlite for non-blocking database operations. |
| """ |
|
|
| import uuid |
| from datetime import datetime, timezone |
| from sqlalchemy import Column, String, Text, DateTime, Integer, Float |
| from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession, async_sessionmaker |
| from sqlalchemy.orm import DeclarativeBase |
|
|
|
|
| class Base(DeclarativeBase): |
| """Base class for all ORM models.""" |
| pass |
|
|
|
|
| class ImageRecord(Base): |
| """ |
| Stores metadata for every image in the system (uploaded or generated). |
| Each record is linked to a ChromaDB embedding via its ID. |
| """ |
| __tablename__ = "image_records" |
|
|
| id = Column(String, primary_key=True, default=lambda: str(uuid.uuid4())) |
| filename = Column(String, nullable=False) |
| original_name = Column(String, nullable=True) |
| description = Column(Text, nullable=True) |
| prompt = Column(Text, nullable=True) |
| generated_prompt = Column(Text, nullable=True) |
| image_url = Column(String, nullable=True) |
| source = Column(String, default="uploaded") |
| created_at = Column(DateTime, default=lambda: datetime.now(timezone.utc)) |
|
|
|
|
| class GenerationHistory(Base): |
| """ |
| Stores the full pipeline history for each generation request. |
| Captures every stage: user input → vision → RAG → prompt → output. |
| """ |
| __tablename__ = "generation_history" |
|
|
| id = Column(String, primary_key=True, default=lambda: str(uuid.uuid4())) |
| user_input = Column(Text, nullable=False) |
| input_type = Column(String, default="text") |
| vision_output = Column(Text, nullable=True) |
| retrieved_context = Column(Text, nullable=True) |
| final_prompt = Column(Text, nullable=True) |
| generated_image_url = Column(String, nullable=True) |
| similarity_score = Column(Float, nullable=True) |
| created_at = Column(DateTime, default=lambda: datetime.now(timezone.utc)) |
|
|
|
|
| |
|
|
| _engine = None |
| _session_factory = None |
|
|
|
|
| async def init_db(database_url: str) -> None: |
| """ |
| Initialize the async database engine and create all tables. |
| Called once during application startup. |
| """ |
| global _engine, _session_factory |
|
|
| _engine = create_async_engine(database_url, echo=False) |
| _session_factory = async_sessionmaker(_engine, class_=AsyncSession, expire_on_commit=False) |
|
|
| |
| async with _engine.begin() as conn: |
| await conn.run_sync(Base.metadata.create_all) |
|
|
|
|
| def get_session_factory() -> async_sessionmaker[AsyncSession]: |
| """ |
| Returns the async session factory. |
| Must be called after init_db(). |
| """ |
| if _session_factory is None: |
| raise RuntimeError("Database not initialized. Call init_db() first.") |
| return _session_factory |
|
|