| """SQLAlchemy engine + session factory.""" | |
| from __future__ import annotations | |
| import os | |
| from collections.abc import Iterator | |
| from contextlib import contextmanager | |
| from sqlalchemy import create_engine | |
| from sqlalchemy.orm import Session, sessionmaker | |
| _DEFAULT_URL = "postgresql+psycopg://cliniq:cliniq@localhost:5432/cliniq" | |
| def database_url() -> str: | |
| return os.getenv("DATABASE_URL", _DEFAULT_URL) | |
| engine = create_engine(database_url(), pool_pre_ping=True, future=True) | |
| SessionLocal = sessionmaker(bind=engine, autoflush=False, autocommit=False, future=True) | |
| def get_session() -> Iterator[Session]: | |
| """FastAPI dependency.""" | |
| s = SessionLocal() | |
| try: | |
| yield s | |
| finally: | |
| s.close() | |
| def session_scope(): | |
| session = SessionLocal() | |
| try: | |
| yield session | |
| session.commit() | |
| except Exception: | |
| session.rollback() | |
| raise | |
| finally: | |
| session.close() |