Spaces:
Sleeping
Sleeping
File size: 1,569 Bytes
d623240 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 | from __future__ import annotations
from collections.abc import Generator
from sqlalchemy import create_engine, text
from sqlalchemy.engine import Engine
from sqlalchemy.orm import Session, sessionmaker
from sqlalchemy.pool import StaticPool
from app.core.config import Settings
from app.db.base import Base
def build_engine(settings: Settings) -> Engine:
connect_args = {"check_same_thread": False} if settings.database_url.startswith("sqlite") else {}
engine_kwargs = {
"echo": settings.database_echo,
"pool_pre_ping": True,
"future": True,
"connect_args": connect_args,
}
if settings.database_url.endswith(":memory:"):
engine_kwargs["poolclass"] = StaticPool
return create_engine(
settings.database_url,
**engine_kwargs,
)
def build_session_factory(engine: Engine) -> sessionmaker[Session]:
return sessionmaker(bind=engine, autoflush=False, autocommit=False, expire_on_commit=False)
def create_tables(engine: Engine) -> None:
Base.metadata.create_all(bind=engine)
def check_database_connection(session: Session) -> bool:
session.execute(text("SELECT 1"))
return True
def get_db_session_factory(request) -> sessionmaker[Session]:
return request.app.state.session_factory
def yield_session(session_factory: sessionmaker[Session]) -> Generator[Session, None, None]:
session = session_factory()
try:
yield session
session.commit()
except Exception:
session.rollback()
raise
finally:
session.close()
|