Router를 통해 db와 커넥션 할때 SessionLocal을 db로 session생성하고 작업을 한 후에 db.close(반환)를 해준다(열고 닫고). 이 과정을 해주지 않으면 커넥션에 문제가 생겨 오류가 발생한다. 나중가면 엄청나게 많은 api가 생길텐데 api마다 이 작업을 해줘야 한다는 의미가 된다. 이것을 해결하기 위해 세션의 생성과 반환을 자동화 한다. 자동화 방법은 2가지(annotation, dependency injection)가 있다.
[annotation]
- database.py에 제너레이터 함수를 만들어 준다.
- question_router.py 의 라우터 함수에 with구문과 함께 제너레이터 함수를 적용한다.
#-------------------- database.py(아래 코드 추가)
import contextlib
@contextlib.contextmanager
def get_db():
db = SessionLocal()
try:
yield db
except:
db.close()
#-------------------- question_router.py(아래처럼 추가 및 수정)
from database import get_db #추가
#수정
@router('/list')
def question_list():
with get_db() as db:
question_list = db.query(Question).order_by(Question.create_date.desc()).all()
return question_list
[dependency]
- FastAPI의 Depends 사용하여 session관리
- Depends는 매개 변수로 전달 받은 함수를 실행시킨 결과를 리턴
- @contextlib annotation은 자동으로 사용되게 내장되어 있으므로 중복 제거
#-------------------- database.py(수정 및 삭제)
#Depends를 사용해 관리(어노테이션 없어야 함)
def get_db():
db = SessionLocal()
try:
yield db
except:
db.close()
#-------------------- question_router.py(추가 및 수정)
#추가
from sqlalchemy.orm import Session
from fastapi import Depends
#수정
@router('/list')
def question_list(db: Session=Depends(get_db):
question_list = db.query(Question).order_by(Question.create_date.desc()).all()
return question_list
'FrameWork > FastAPI' 카테고리의 다른 글
CRUD (0) | 2024.05.26 |
---|---|
Pydantic & 스키마 (0) | 2024.05.26 |
Router (0) | 2024.05.25 |
database 구축 (0) | 2024.05.24 |
프로젝트 구조 (0) | 2024.05.24 |