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은 웹에서 필요한 부분이라고 할 수 있어요.
메뉴를 등록하고 조회해 볼 수 있는 웹을 간단하게 완성했어요. 이 파일을 환인 해보면서 최대한 구조를 파악하고 파일을 분리하세요.
'코딩 프로그래밍 > PYTHON 파이썬' 카테고리의 다른 글
sqlalchemy 테이블 컬럼 목록 (0) | 2023.03.30 |
---|---|
vscode 파일 목록에서 __pycache__ 안보이게 하기 (0) | 2023.03.29 |
FastAPI 설정 관리, main.py 폴더 구조 (0) | 2023.03.28 |
FastAPI 시작하기 (0) | 2023.03.28 |
pyenv 꼭 사용하세요 (0) | 2023.03.28 |
댓글