Data Navigator

FastAPI로 이벤트 플래너 만들기 04 - DB 연결하기 본문

FastAPI

FastAPI로 이벤트 플래너 만들기 04 - DB 연결하기

코딩하고분석하는돌스 2024. 5. 12. 17:46

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

- DB 연결하기 -

 

 

 

지금까지 구현한 것들은 DB에 연결하지 않았기 때문에 서버를 재시작하면 데이터가 모두 사라졌다. 자료를 영구적으로 저장히기 위해서 데이터베이스를 연결하자.

 

1. sqlmodel 설치

pip 를 이용해 sqlmodel 라이브러리를 설치한다.

pip install sqlmodel

 

2. sqlmodel을 이용해서 sqlite 데이터베이스 만들고 연결하기

1) database/connection.py에 데이터베이스 및 테이블 생성을 위한 코드를 작성한다.

# database/connection.py
from sqlmodel import SQLModel, Session, create_engine
from models.events import Event

database_file = "planner.db"
database_connection_string = f"sqlite:///{database_file}"
connect_args = {"check_same_thread": False}
engine_url = create_engine(database_connection_string, echo=True, connect_args=connect_args)

def conn():
    SQLModel.metadata.create_all(engine_url)

def get_session():
    with Session(engine_url) as session:
        yield session

 

 

3. models/events.py에 정의한 Event클래스 변경

 models/events.py에 정의한 Event클래스를 변경해서 SQLModel 테이블을 사용하도록 수정한다.

# models/enevts.py
from sqlmodel import JSON, SQLModel, Field, Column
from typing import List, Optional

class Event(SQLModel, table=True):
    id : int = Field(default=None, primary_key=True)
    title : str
    image : str
    description : str
    tags : List[str] = Field(sa_column=Column(JSON))
    location : str

    # 위 모델의 샘플 데이터를 보여주기 위한 Config class 작성
    class Config:
        arbitrary_types_allowed = True
        json_schema_extra = {
            "example" : {
                "title" : "이벤트 플래너 샘플",
                "image" : "https://fastapi.tiangolo.com/ko/assets/images/social/index.png",
                "description" : "이벤트 플래너 데이터 샘플",
                "tags" : ["python","fastapi","book","sample"],
                "location" : "서울"
            }
        }

 

 

4. update 처리를 위한 EventUpdate 모델 추가

위에서 수정한 Event 클래서 아래에 update 처리를 위한 EventUpdate 모델을 추가한다.

 

# models/events.py
#업데이트를 위한 모델 추가
class EventUpdate(SQLModel):
    title : Optional[str]
    image : Optional[str]
    description : Optional[str]
    tags : Optional[List[str]]
    location : Optional[str]

    class Config:
        json_schema_extra = {
            "example" : {
                "title" : "이벤트 플래너 샘플",
                "image" : "https://fastapi.tiangolo.com/ko/assets/images/social/index.png",
                "description" : "이벤트 플래너 데이터 샘플",
                "tags" : ["python","fastapi","book","sample"],
                "location" : "서울"
            }

        }

 

5. main.py를 애플리케이션이 시작될 때 DB를 생성하도록 수정

# planner/main.py
from fastapi import FastAPI
from fastapi.responses import RedirectResponse
from typing import List
from database.connection import conn
from routes.users import user_router
from routes.events import event_router
import uvicorn

app = FastAPI()

# 라우트 등록
app.include_router(user_router, prefix="/user")
app.include_router(event_router, prefix="/event")

@app.on_event("startup")
def on_startup():
    conn()

@app.get("/")
async def home():
    return RedirectResponse(url="/event/")

if __name__ == "__main__":
    uvicorn.run("main:app", host="127.0.0.1", port=8000, reload=True)

 

6. 데이터베이스 생성 테스트

main.py 내용 수정을 마치면 터미널에서 python main.py를 실행해 서버를 구동하자.

python main.py

 

 

서버가 구동되면서 데이터베이스 생성 메세지가 출력되면서 planner.db 파일이 만들어지면 성공이다.

 

 

 

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