33 lines
814 B
Python
33 lines
814 B
Python
"""SQLAlchemy engine + scoped session for the app."""
|
|
from __future__ import annotations
|
|
|
|
from sqlalchemy import create_engine
|
|
from sqlalchemy.orm import DeclarativeBase, scoped_session, sessionmaker
|
|
|
|
|
|
class Base(DeclarativeBase):
|
|
pass
|
|
|
|
|
|
_engine = None
|
|
_Session: scoped_session | None = None
|
|
|
|
|
|
def init_engine(url: str):
|
|
global _engine, _Session
|
|
_engine = create_engine(url, pool_pre_ping=True, future=True)
|
|
_Session = scoped_session(sessionmaker(bind=_engine, expire_on_commit=False, future=True))
|
|
return _engine
|
|
|
|
|
|
def get_engine():
|
|
if _engine is None:
|
|
raise RuntimeError("Engine not initialized — call init_engine() in create_app")
|
|
return _engine
|
|
|
|
|
|
def db_session():
|
|
if _Session is None:
|
|
raise RuntimeError("Session factory not initialized")
|
|
return _Session
|