본문 바로가기
코딩 프로그래밍/PYTHON 파이썬

FastAPI 데이터베이스 연동 sqlalchemy

by 프즈 2023. 3. 29.
반응형

FastAPI 같은 백엔드 작업하면 데이터베이스 연동은 거의 필수적이라고 할 수 있는데요. RDB 접속하는 경우에는 sqlalchemy 많이 이용하고 있어요. 처음부터 파일을 여러 개 만들어서 나누는 경우 조금 헷갈릴 수 있어요. 돌아가는 과정을 파악하기 위해서 단순화해서 만들어보는 것이 좋습니다. mysql을 가지고 테스트 합니다.

DB 접근에 필요한 sqlalchemy를 설치합니다.

pip install sqlalchemy

DB를 mysql을 사용할 것이라서 필요한 pymysql을 설치합니다.

pip install pymysql

main.py 파일 하나만 가지고 테이블을 만들고 입력하고 조회하는 부분을 만들었습니다. 최대한 간단하게 하려고 했는데 만들다 보니 길어졌네요. 주석을 넣어두기는 했어요.

 

from typing import Union

from fastapi import FastAPI, Depends

import sqlalchemy 
from sqlalchemy.ext import declarative 
from sqlalchemy import orm, Column, Integer, String
from pydantic import BaseModel
from typing import List, Optional


## 데이터베이스 관련 설정

DATABASE_URL = "mysql+pymysql://test:test@localhost/test?charset=utf8mb4"
engine = sqlalchemy.create_engine(DATABASE_URL)
SessionLocal = orm.sessionmaker(autocommit=False, autoflush=False, bind=engine)
Base = declarative.declarative_base()

# 세션 가져오기
def get_db():
    db = SessionLocal()
    try:
        yield db
    finally:
        db.close()

# DB Schema
class Menu(Base):
    __tablename__ = "menu"
    id = Column(Integer, primary_key=True, index=True)
    title = Column(String(length=255), index=True)
    description = Column(String(length=500), index=True)

# Model 
class MenuSchema(BaseModel):
    title: str
    description: str
    class Config:
        orm_mode = True

app = FastAPI()

@app.get("/")
def read_root():
    return {"Hello": "World"}

@app.get("/menus", response_model=List[MenuSchema])
async def read_menu(db: orm.Session = Depends(get_db)):
    menus = db.query(Menu).all()
    return list(map(MenuSchema.from_orm, menus))

@app.post("/menu")
async def create_menu(
    menu: MenuSchema, db: orm.Session = Depends(get_db)
):
    menudata = Menu(title=menu.title, description=menu.description)
    db.add(menudata)
    db.commit()
    db.refresh(menudata)
    return menudata

# 관련 테이블이 생성되게 한다.
Base.metadata.create_all(bind=engine)

데이터베이스 관련 설정에서 sqlalchemy를 사용하기 위한 최소한의 설정했어요. mysql에 접속하는 코드와 DB 연결하는 부분이 들어있어요. 다른 DB를 사용하려고 한다면 DATABASE_URL 부분만 수정하면 사용할 수 있을 겁니다.

DB Schema 부분을 통해서 어떤 테이블이 만들어 질지 코드로 정의할 수 있어요. 이 내용으로 마지막에 Base.metadata.create_all 실행될 때 테이블을 생성해 줘요. 구조를 파악하기 위해서 하나의 파일이 이렇게 다 하는 것이고 나중에는 분리해야 합니다. 

Model 부분에서 API에서 데이터 통신할 때 필요한 데이터 보양을 미리 정의해 놓습니다. DB Schema 부분은 DB에게 필요한 부분이고 Model은 웹에서 필요한 부분이라고 할 수 있어요. 

메뉴를 등록하고 조회해 볼 수 있는 웹을 간단하게 완성했어요. 이 파일을 환인 해보면서 최대한 구조를 파악하고 파일을 분리하세요.

 

반응형

댓글