Update docs and screenshots
CI / backend (pull_request) Canceled after 0s
CI / shell (pull_request) Canceled after 0s
CI / frontend (pull_request) Canceled after 0s
CI / arm64-smoke (pull_request) Canceled after 0s
CI / backend (push) Canceled after 0s
CI / shell (push) Canceled after 0s
CI / frontend (push) Canceled after 0s
CI / arm64-smoke (push) Canceled after 0s
CI / backend (pull_request) Canceled after 0s
CI / shell (pull_request) Canceled after 0s
CI / frontend (pull_request) Canceled after 0s
CI / arm64-smoke (pull_request) Canceled after 0s
CI / backend (push) Canceled after 0s
CI / shell (push) Canceled after 0s
CI / frontend (push) Canceled after 0s
CI / arm64-smoke (push) Canceled after 0s
This commit is contained in:
@@ -0,0 +1,45 @@
|
||||
from collections.abc import AsyncIterator
|
||||
|
||||
from sqlalchemy import event, text
|
||||
from sqlalchemy.ext.asyncio import AsyncSession, async_sessionmaker, create_async_engine
|
||||
|
||||
from app.core.config import get_settings
|
||||
from app.models.base import Base
|
||||
|
||||
settings = get_settings()
|
||||
engine = create_async_engine(settings.database_url, future=True)
|
||||
SessionLocal = async_sessionmaker(engine, expire_on_commit=False, class_=AsyncSession)
|
||||
|
||||
|
||||
@event.listens_for(engine.sync_engine, "connect")
|
||||
def _enable_sqlite_pragmas(dbapi_connection, _connection_record) -> None: # type: ignore[no-untyped-def]
|
||||
cursor = dbapi_connection.cursor()
|
||||
cursor.execute("PRAGMA journal_mode=WAL;")
|
||||
cursor.execute("PRAGMA foreign_keys=ON;")
|
||||
cursor.close()
|
||||
|
||||
|
||||
async def init_database() -> None:
|
||||
async with engine.begin() as connection:
|
||||
await connection.execute(text("PRAGMA journal_mode=WAL;"))
|
||||
await connection.run_sync(Base.metadata.create_all)
|
||||
await _ensure_compatible_schema(connection)
|
||||
|
||||
|
||||
async def get_db_session() -> AsyncIterator[AsyncSession]:
|
||||
async with SessionLocal() as session:
|
||||
yield session
|
||||
|
||||
|
||||
async def _ensure_compatible_schema(connection) -> None: # type: ignore[no-untyped-def]
|
||||
def sync_ensure(sync_connection) -> None: # type: ignore[no-untyped-def]
|
||||
scene_columns = {
|
||||
row[1]
|
||||
for row in sync_connection.exec_driver_sql("PRAGMA table_info('scenes')").fetchall()
|
||||
}
|
||||
if "targets" not in scene_columns:
|
||||
sync_connection.exec_driver_sql(
|
||||
"ALTER TABLE scenes ADD COLUMN targets JSON NOT NULL DEFAULT '[]'"
|
||||
)
|
||||
|
||||
await connection.run_sync(sync_ensure)
|
||||
Reference in New Issue
Block a user