| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748 |
- """Database dialect helpers for SQLite/PostgreSQL dual support.
- Bambuddy defaults to SQLite (zero-config). When DATABASE_URL points to PostgreSQL,
- these helpers ensure dialect-specific operations use the correct SQL.
- """
- from sqlalchemy import func, text
- def is_postgres() -> bool:
- """Check if using PostgreSQL based on DATABASE_URL."""
- from backend.app.core.config import settings
- return settings.database_url.startswith("postgresql")
- def is_sqlite() -> bool:
- """Check if using SQLite based on DATABASE_URL."""
- from backend.app.core.config import settings
- return settings.database_url.startswith("sqlite")
- async def upsert_setting(db, model, key: str, value: str):
- """Dialect-aware INSERT ... ON CONFLICT UPDATE for the Settings table."""
- if is_postgres():
- from sqlalchemy.dialects.postgresql import insert as pg_insert
- stmt = pg_insert(model).values(key=key, value=value)
- stmt = stmt.on_conflict_do_update(
- index_elements=["key"],
- set_={"value": value, "updated_at": func.now()},
- )
- else:
- from sqlalchemy.dialects.sqlite import insert as sqlite_insert
- stmt = sqlite_insert(model).values(key=key, value=value)
- stmt = stmt.on_conflict_do_update(
- index_elements=["key"],
- set_={"value": value, "updated_at": func.now()},
- )
- await db.execute(stmt)
- async def run_pragma(conn, pragma_sql: str):
- """Run a PRAGMA statement only on SQLite (no-op on PostgreSQL)."""
- if is_sqlite():
- await conn.execute(text(pragma_sql))
|