Spaces:
Paused
Paused
File size: 2,255 Bytes
9e65b56 | 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 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 | """
SQLAlchemy 2.0 ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ง/์ธ์
์ค์ .
๋๊ธฐ ์ธ์
๊ธฐ๋ฐ์ผ๋ก ๊ตฌ์ฑํ๋ฉฐ, FastAPI ์์กด์ฑ ์ฃผ์
(get_db)์ ์ ๊ณตํ๋ค.
๊ธฐ๋ณธ๊ฐ์ ๋ก์ปฌ ๋จ์ผ ์ฌ์ฉ์ MVP์ ๋ง์ถฐ GovOn ํ ๋๋ ํฐ๋ฆฌ ์๋ SQLite ํ์ผ์ ์ฌ์ฉํ๋ค.
"""
import logging
import os
from pathlib import Path
from typing import Generator
from sqlalchemy import create_engine
from sqlalchemy.orm import Session, sessionmaker
logger = logging.getLogger(__name__)
# ---------------------------------------------------------------------------
# ์์ง & ์ธ์
ํฉํ ๋ฆฌ
# ---------------------------------------------------------------------------
_DEFAULT_GOVON_HOME = Path(os.getenv("GOVON_HOME", Path.home() / ".govon"))
_DEFAULT_DATABASE_URL = f"sqlite:///{_DEFAULT_GOVON_HOME / 'metadata.sqlite3'}"
DATABASE_URL: str = os.getenv("DATABASE_URL", _DEFAULT_DATABASE_URL)
if DATABASE_URL == _DEFAULT_DATABASE_URL:
logger.warning(
"DATABASE_URL ํ๊ฒฝ๋ณ์๊ฐ ์ค์ ๋์ง ์์ ๋ก์ปฌ SQLite ๊ธฐ๋ณธ๊ฐ์ ์ฌ์ฉํฉ๋๋ค. "
"๋ณ๋ RDBMS๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด DATABASE_URL์ ๋ช
์์ ์ผ๋ก ์ค์ ํ์ธ์."
)
engine_kwargs = {
"echo": os.getenv("SQL_ECHO", "").lower() in ("1", "true"),
}
if DATABASE_URL.startswith("sqlite:///"):
_DEFAULT_GOVON_HOME.mkdir(parents=True, exist_ok=True)
engine_kwargs["connect_args"] = {"check_same_thread": False}
else:
engine_kwargs.update(
{
"pool_size": 10,
"max_overflow": 20,
"pool_pre_ping": True,
"pool_recycle": 3600,
}
)
engine = create_engine(DATABASE_URL, **engine_kwargs)
SessionLocal = sessionmaker(
bind=engine,
autocommit=False,
autoflush=False,
)
# ---------------------------------------------------------------------------
# FastAPI ์์กด์ฑ ์ฃผ์
# ---------------------------------------------------------------------------
def get_db() -> Generator[Session, None, None]:
"""FastAPI Depends()์ฉ ์ธ์
์ ๋๋ ์ดํฐ.
์ฌ์ฉ ์์::
@router.get("/docs")
def list_docs(db: Session = Depends(get_db)):
...
"""
db = SessionLocal()
try:
yield db
finally:
db.rollback()
db.close()
|