본문 바로가기
Backend MLOps/Database

Fastapi docs 무작정 따라하기 ORM 편 - 3

by SteadyForDeep 2022. 6. 7.
반응형

Main FastAPI app

이제 모든 파일을 통합해 보자.
나는 ./sql_app/main.py 로 만들지 않고 ./main.py 로 만들었다.
이렇게 하는 편이 다른 앱을 만들 때와 더 유사하다고 판단했기 때문이다.

우선 코드를 모두 적고 하나씩 분석해 보자.

DB ionitialize

앞서 작성한 models.py에 있는 테이블들을 모두 생성한다.
그리고 그 모델들은 condition을 만족하는 engine에 연결된다.

Dependency

서버에 여러 요청이 동시에 들어온다고 가정해보면
각각의 요청에 따라 DB의 로컬세션을 생성하고 요청에 맞는 작업을 수행 한 후
세션을 커밋하고 닫는 일련의 작업이 필요하다.
즉 어떤 메소드가 수행되기 전과 후에 DB를 열고 닫는 데코레이터같은 기능이 필요한데
이를 위해서 yield를 통해 만들어지는 generator를 이용할 수 있다.
자세한 설명은 여기를 통해 확인.
yield는 async 비동기와는 조금 다른데 이 부분을 얕게 나마 여기에 설명해 두었다.
아무튼 tryyield를 이용하여 데코레이터같은 기능을 구현할 수 있다.

여기서 중요한 것은 SQLAlchemy에서 async 비동기를 지원하는가 인데
일단은 여기서 사용한 코드들은 지원하지 않는 방식으로 작성되어있다.
코루틴 객체들은 일반적인 동기 함수와 섞어 쓰는게 불가능하므로 우선은
async 비동기는 생각하지 않고 모든 함수를 def로 작성한다.

나중에 async SQL과 연동하는 방법을 사용하여 얼마나 빨라질 수 있는지 확인해 보자.

Method

나머지 부분은 모두 fastapi의 기본적인 사용법이다.
여기서 raise를 이용한 에러발생이 있는데 이 에러 발생을 Dependency에서 exception으로 잡아내서
예외처리를 해 주는 것이 가능하다.

Check it

사용해보자.

윈도우라서 이렇게 서버를 열어줬다.
포스트맨도 편하지만 스웨거를 이용해서 진행해 보자.

유저를 만들었더니 이런 에러가 생겼다.
schemas.UserCreate 에 password가 없어서 그렇다고 하니 수정해 주자.

그리고 아래와 같이 body를 작성해서 execute 하면 DB가 생성되는 것을 볼 수 있다.

 
반응형

댓글