Files
bin/finance/app/db.py
T

32 lines
848 B
Python

from sqlalchemy import create_engine, text
from sqlalchemy.orm import DeclarativeBase, Session
from app.config import get_settings
class Base(DeclarativeBase):
pass
_engine = None
def get_engine():
global _engine
if _engine is None:
_engine = create_engine(get_settings().database_url)
return _engine
def get_session():
with Session(get_engine()) as session:
yield session
def advisory_xact_lock(session: Session, key: int) -> None:
"""Serialisiert konkurrierende Schreiber abgeleiteter Daten (Projektionen,
Planungs-Diagramm) über einen Postgres-Transaktions-Advisory-Lock. Der
Lock endet mit dem nächsten commit/rollback. Auf SQLite (Tests) No-Op."""
if session.get_bind().dialect.name == "postgresql":
session.execute(text("SELECT pg_advisory_xact_lock(:k)"), {"k": key})