Data Navigator

FastAPI로 이벤트 플래너 만들기 05 - 이벤트 CRUD 구현 - 본문

FastAPI

FastAPI로 이벤트 플래너 만들기 05 - 이벤트 CRUD 구현 -

코딩하고분석하는돌스 2024. 5. 13. 10:25

FastAPI로 이벤트 플래너 만들기 05

- 이벤트 CRUD 구현 - 

 

SQLModel과 sqlite로 만든 DB를 이용해 이벤트 데이터에 대한 CRUD를 구현한다.

 

1. 이벤트 생성 만들기

(1) routes/events.py를 수정해서 신규 이벤트 생성을 담당하는 route를 만든다.

라이브러리를 추가로 import 하고 이벤트 생성 라우트 부분의 내용을 수정한다.

# route/event.py
# Depends, Request를 import하고 database 관련 부분 import
from fastapi import APIRouter, Depends, HTTPException, Request, status
from database.connection import get_session
from models.events import Event, EventUpdate
from typing import List


... 윗쪽 생략

# 이벤트 생성 라우트 - db session에 의존하도록 수정
@event_router.post("/new")
async def create_event(new_event: Event, session=Depends(get_session)) -> dict:
    session.add(new_event)
    session.commit()
    session.refresh(new_event)
    return {
        "message" : "Event created successfully."
    }

 

 

(2) python main.py 로 서버를 실행하고 localhost:8000/docs에 접속해 POST /event/new 를 테스트 한다.

 

 

try it out을 누르고 테스트 값을 넣었을 때 Event created successfully 가 출력되면 성공이다.

 

2. 이벤트 조회 만들기

DB에 저장된 이벤트를 모두 불러오거나 id 별로 불러오는 라우터를 만들자.

1) routes/events.py 에서 이벤트 조회 라우트 부분을 찾아 수정한다.

(1) sqlmodel에서 select를 추가로 import 하고 전체 목록을 조회하는 retrieve_all_events 함수를 수정한다.

# route/events.py
# sqlmodel 에서 select 추가 import

from sqlmodel import select

# 전체 이벤트 조회 라우트 수정
@event_router.get("/", response_model=List[Event])
async def retrieve_all_events(session=Depends(get_session)) -> List[Event]:
    statement = select(Event)
    events = session.exec(statement).all()
    return events

 

(2) 지정한 id의 정보를 표시하는 라우트도 변경한다.

# route/events.py 
# id로 이벤트를 조회하는 라우트
@event_router.get("/{id}", response_model=Event)
async def retrieve_event(id: int, session=Depends(get_session)) -> Event:
    event = session.get(Event, id)
    if event:
        return event
    raise HTTPException(
        status_code=status.HTTP_404_NOT_FOUND,
        detail="Event with supplied ID does not exist"
    )

 

 

2) 서버를 실행하고 POST /event/new 에서 이벤트를  여러 개 등록 한 후 GET /event/ Retrieve All Events에서 조회해 보자.

위와 같이 여러 개의 데이터가 조회되면 성공이다.

 

3) GET /event/{id} Retrieve Event 에서 id에 3을 넣고 조회해 보자.

 

id 3번에 해당하는 데이터가 잘 조회된다면 성공.

 

3. 이벤트 업데이트(변경) 하기

1) update 기능을 구현하기 위해서 route/events.py의 update_event 함수를 추가한다.

# route/events.py 에 추가
# 이벤트 수정 라우트
@event_router.put("/edit/{id}", response_model=Event)
async def update_event(id: int, new_data: EventUpdate, session=Depends(get_session))-> Event:
    event = session.get(Event, id)
    if event:
        event_data = new_data.dict(exclude_unset=True)
        for key, value in event_data.items():
            setattr(event, key, value)
        session.add(event)
        session.commit()
        session.refresh(event)
        return event
    raise HTTPException(
        status_code=status.HTTP_404_NOT_FOUND,
        detail="Event with supplied ID does not exist"
    )

 

2) 서버를 실행하고 localhost:8000/docs로 가서  PUT /event/edit/{id}에서 try it out을 누르고 id에 1일 입력한 후 내용을 수정해 보자. description 내용과 title을 이벤트 플래너 데이터 샘플 1 수정으로 고치고 excute를 누른다.

위와 같이 code 200이 나오면서  변경한 내용이 반영 되면 성공.

 

GET /event/retrieve/{id} 로 가서 try it out을 누르고 id에 1번을 넣어서 다시 한 번 확인해 보자.

title과 description이 이벤트 플래너 데이터 샘플1 수정으로 잘 변경 되어있는 것을 확인 할 수 있다.

 

4. 이벤트 삭제하기

route/enevts.py에 있는 delete_event 함수를 수정해서 이벤트를 삭제도록 만들자.

# route/events.py
# 단일 이벤트 삭제 라우트 수정
@event_router.delete("/delete/{id}")
async def delete_event(id: int, session=Depends(get_session)) -> dict:
    event = session.get(Event, id)
    if event:
        session.delete(event)
        session.commit()
        return {
            "message" : "Event deleted successfully."
        }
    raise HTTPException(
        status_code=status.HTTP_404_NOT_FOUND,
        detail="Event with supplied ID does not exist"
    )

localhost/8000/docs에서 DELETE /event/delete/{id} 로 가서 try it out 을 누르고 id 1번을 입력해 id 1번 이벤트를 삭제해 보자.

 

삭제가 정상적으로 되었다면 Event delete sucessfully. 가 출력된다.

다시 확인을 위해서 GET /event/retrieve/{id} 로 가서 try it out을 누르고 id에 1번을 넣어서 다시 한 번 확인해 보자.

id 1번 이벤트를 삭제했으므로 Event with supplied ID does not exist가 출력되어야 정상이다.

 

출처: 아데시나, 압둘라지즈 압둘라지즈. FastAPI를 사용한 파이썬 웹 개발. 번역 김완섭. 한빛미디어, 2023