FastAPI

RDB 연동 - 3

깽원 2024. 2. 2. 01:34

RDB 연동 - 1

 

RDB 연동 - 1

RDB는 관계형 데이터 베이스의 약어입니다. 전통적으로 많이 사용하는 DBMS입니다. 즉, 데이터 베이스라고 합니다. python에서 DB 즉, 데이터 베이스를 다루기 위해서는 ORM(Object Relation Mapper)라는 것

kbgw2001.tistory.com

RDB 연동 - 2

 

RDB 연동 - 2

RDB 연동 - 1 (tistory.com) RDB 연동 - 1 RDB는 관계형 데이터 베이스의 약어입니다. 전통적으로 많이 사용하는 DBMS입니다. 즉, 데이터 베이스라고 합니다. python에서 DB 즉, 데이터 베이스를 다루기 위해

kbgw2001.tistory.com

 

위의 RDB 연동 -1, RDB 연동 -2에 이어서 3번째 글을 작성해 보겠습니다.

 

우선 살펴볼 코드는 main.py의 전체 코드는 내용입니다.

 

import uvicorn
from typing import List

from fastapi import Depends, FastAPI, HTTPException
from sqlalchemy.orm import Session

from . import models, schemas
from .database import SessionLocal, engine

models.Base.metadata.create_all(bind=engine)


app = FastAPI()


def get_db():
    db = SessionLocal()
    try:
        yield db
    finally:
        db.close()


@app.post("/users", response_model=schemas.User)
def create_user(user: schemas.UserCreate, db: Session = Depends(get_db)):
    existed_user = db.query(models.User).filter_by(
        email=user.email
    ).first()

    if existed_user:
        raise HTTPException(status_code=400, detail="Email already registered")

    user = models.User(email=user.email, password=user.password)
    db.add(user)
    db.commit()

    return user


@app.get("/users", response_model=List[schemas.User])
def read_users(db: Session = Depends(get_db)):
    return db.query(models.User).all()

if __name__ == '__main__':
	uvicorn.run('main:app', reload = True)

 

위에서 from . import models, schemas를 사용해서 RDB 연동 - 2에서 만든 models와 schmas를 불러옵니다. 그리고 database에서 SessionLocal과 engine을 불러옵니다.

 

그 다음으로는 models.Base.metadata.create_all(bind=engine) 구문이 있습니다. 해당 코드의 의미는 우리가 Models에서 정의한 Table 즉, User Table을 DB에 만든다는 의미입니다.

 

다음 코드 부분을 보면, 

app = FastAPI()


def get_db():
    db = SessionLocal()
    try:
        yield db
    finally:
        db.close()

 

이렇게 작성되어져 있습니다. 우선 FastAPI 앱을 만들고, DB를 사용하기 위한 helper 함수인 get_db를 정의했습니다.

SessionLocal을 사용해서 db라는 Session을 생성을 하고, db를 yeield를 해줍니다.

 

yeield의 경우, 반환하고 함수의 역할일 끝나는 return과는 달리 yeield는  반환하고 함수의 역할일 끝나지 않는 일종의 서브 루틴의 개념입니다.  

 

어떤 error가 나든 반드시 db Session을 종료하도록 설정되어져 있습니다.

 

다음 코드 부분을 보면, 이렇게 작성되어져 있습니다.

@app.post("/users", response_model=schemas.User)
def create_user(user: schemas.UserCreate, db: Session = Depends(get_db)):
    existed_user = db.query(models.User).filter_by(
        email=user.email
    ).first()

    if existed_user:
        raise HTTPException(status_code=400, detail="Email already registered")

    user = models.User(email=user.email, password=user.password)
    db.add(user)
    db.commit()

    return user

 

위의 API는 User를 생성하기 위한 API입니다. 위에 코드에서 create_user는 user와 db를 입력으로 받는데, 그중 schemas에 UserCreate를 입력으로 받습니다.

 

schemas에 UserCreate를 보면 다음과 같습니다.

from pydantic import BaseModel


class UserBase(BaseModel):
    email: str


class UserCreate(UserBase):
    password: str


class User(UserBase):
    id: int
    email: str
    is_active: bool

    class Config:
        orm_mode = True

 

UserCreate는 UserBase를 상속 받습니다. 즉 UserCreate는 email과 password를 입력으로 받습니다.

 

db라는 parameter에 Depends 함수를 사용해서 get_db를 입력으로 받습니다. 그리고 아래 부분의 코드에서

 

existed_user = db.query(models.User).filter_by(
        email=user.email
    ).first()

 

db에 우리가 만든 Table인 User라는 곳에 우리가 입력 받은 user의 email의 값을 filter_by라는 함수를 통해서 db에 있는 User라는 Table에 email이 존재하는지 확인을 하는 코드입니다.

 

if existed_user:
        raise HTTPException(status_code=400, detail="Email already registered")

 

그리고 이 코드와 같이 만약 email이 이미 있는 경우에는 HTTPException을 통해서 이메일이 이미 등록을 했다.라는 것을 반환하게 됩니다.

 

만약에 없는 경우에, 다음 코드를 사용해서

user = models.User(email=user.email, password=user.password)

 

email과 password를 입력을 가지고 있는 user table을 만들고, db에 추가하고 commit을 해주어 db에 반영을 해주게 됩니다. 위와 같은 방법을 사용해서 user를 간단하게 생성을 했습니다.

 

다음은 read_users에 해당하는 코드입니다. db에서 user를 읽고 반환을 합니다.

@app.get("/users", response_model=List[schemas.User])
def read_users(db: Session = Depends(get_db)):
    return db.query(models.User).all()

 

 

새성된 Session은 db에 query를 날리고 해당 대상은 User라는 Table입니다.

 

all이라는 함수를 사용해서 User에 있는 모든 기록들을 가져 오게됩니다.