본문 바로가기
FrameWork/FastAPI

db커넥션 관리

by mansoorrr 2024. 5. 25.

Router를 통해 db와 커넥션 할때 SessionLocal을 dbsession생성하고 작업을 한 후에 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

annotation결과

 

[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

Depends 사용하여 db session관리: 정상작동 확인

'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