| from collections.abc import Iterator | |
| from sqlalchemy import create_engine, event | |
| from sqlalchemy.orm import Session, sessionmaker | |
| from app.core.config import settings | |
| _is_sqlite = settings.database_url.startswith("sqlite") | |
| _connect_args = {"check_same_thread": False, "timeout": 30} if _is_sqlite else {} | |
| engine = create_engine( | |
| settings.database_url, | |
| pool_pre_ping=True, | |
| future=True, | |
| connect_args=_connect_args, | |
| ) | |
| if _is_sqlite: | |
| # WAL: reader μ writer κ° κ³΅μ‘΄(ν μ€νΈμ eager worker λμ μ°κΈ° λ°λλ½ λ°©μ§). | |
| # μ΄μ(Postgres)μλ μν₯ μμ. | |
| def _sqlite_pragmas(dbapi_conn, _record): # pragma: no cover | |
| cur = dbapi_conn.cursor() | |
| cur.execute("PRAGMA journal_mode=WAL") | |
| cur.execute("PRAGMA busy_timeout=30000") | |
| cur.close() | |
| SessionLocal = sessionmaker(bind=engine, autoflush=False, autocommit=False, future=True) | |
| def get_db() -> Iterator[Session]: | |
| """FastAPI μμ‘΄μ±: μμ² λ¨μ DB μΈμ .""" | |
| db = SessionLocal() | |
| try: | |
| yield db | |
| finally: | |
| db.close() | |