from sqlalchemy.ext.asyncio import AsyncSession, create_async_engine, async_sessionmaker from sqlalchemy.orm import DeclarativeBase from backend.app.core.config import settings engine = create_async_engine( settings.database_url, echo=settings.debug, ) async_session = async_sessionmaker( engine, class_=AsyncSession, expire_on_commit=False, ) class Base(DeclarativeBase): pass async def get_db() -> AsyncSession: async with async_session() as session: try: yield session await session.commit() except Exception: await session.rollback() raise finally: await session.close() async def init_db(): # Import models to register them with SQLAlchemy from backend.app.models import printer, archive, filament, settings # noqa: F401 async with engine.begin() as conn: await conn.run_sync(Base.metadata.create_all) # Run migrations for new columns (SQLite doesn't auto-add columns) await run_migrations(conn) async def run_migrations(conn): """Add new columns to existing tables if they don't exist.""" from sqlalchemy import text # Migration: Add is_favorite column to print_archives try: await conn.execute(text( "ALTER TABLE print_archives ADD COLUMN is_favorite BOOLEAN DEFAULT 0" )) except Exception: # Column already exists pass