카테고리 없음

[FastAPI] 1. FastAPI 설치, MariaDB(MySQL) 연동

뒷골목프로그래머 2022. 9. 15. 19:21
반응형

 LifeSports 개발 시리즈의 첫 번째 연재물로써 Backend 기술 스택 선정과 개발의 시작이라 할 수 있는 FastAPI - MariaDB 연동 방법을 소개하겠습니다. (MariaDB 설치 및 사용은 Docker의 MariaDB 공식 image를 사용하였으며 별도로 설치 방법은 소개하지 않겠습니다.)

 

1. 사용한 기술

  • Python 3.10+
    •  FastAPI는 Python의 약점이라고 할 수 있는 Type 문제를 해결하는 데 집중하였습니다. 공식문서에서도 항상 type hint를 사용하고 Request/Response 인터페이스를 맞추기 위해 Pydantic을 사용합니다. 그래서 저는 'typing' 모듈을 별도로 import 할 필요 없는 Python 3.10 버전 이상을 사용하였습니다.
  • Why? MariaDB
    • RDBMS로 MariaDB를 선택한 이유는 오픈소스이기 때문입니다.

2. FastAPI 설치

1) 가상환경 생성

python -m venv venv
source venv/bin/activate  # mac, linux
.\venv\Scripts\activate   # windows

2) FastAPI, uvicorn 설치

pip install "uvicorn[standard]"
pip install "fastapi[all]"

3) main.py 생성

# backend/main.py
from fastapi import FastAPI

app = FastAPI()


@app.get("/")
async def root():
    return {"message": "Hello World"}

4) 실행

uvicorn main:app --reload

 

3. MariaDB(MySQL) 연동 (MariaDB 설치 가정)

1) SQLalchemy, PyMySQL 설치

    DB Connection, ORM 사용하기 위해 SQLalchemy를 설치합니다. 또한, MariaDB를 사용하기 위해 PyMySQL도 설치합니다.

pip install SQLAlchemy
pip install PyMySQL

 

2) DB Connection

 DB 접속 정보를 secret.json으로 별도 관리하면서 SQLalchemy를 통해 연결합니다. (secret.json 은 절대, git에 업로드되면 안됩니다.)

# backend/config/database.py

import json
import os

from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

BASE_DIR = os.path.dirname(os.path.abspath(__file__))

SECRET_FILE = os.path.join(BASE_DIR, 'secrets.json')
secrets = json.loads(open(SECRET_FILE).read())
db = secrets["db"]

SQLALCHEMY_DATABASE_URL = f"mysql+pymysql://{db.get('user')}:{db.get('password')}@{db.get('host')}:{db.get('port')}/{db.get('database')}?charset=utf8"

engine = create_engine(
    SQLALCHEMY_DATABASE_URL
)
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)

Base = declarative_base()
# backend/config/secrets.json

{
    "DB": {
        "user": "{ DB-USER-NAME }",
        "password": "{ DB-PASSWORD }",
        "host": "{ DB-HOST-IP-ADDRESS }",
        "port": { DB-PORT },
        "database": "{ DB-NAME } "
    }
}

 

3) Dependency 생성

 요청마다 독립적인 데이터베이스 세션/연결(SessionLocal)을 가지고 모든 요청에 동일한 세션을 사용한 후 요청이 완료된 후 닫아야 합니다. 그런 다음 다음 요청에 대한 새 세션이 생성됩니다. get_db 메소드 내부의 finally 에서 close() 시킵니다. 
 따라서 단일 request 마다 새로운 SQLalchemy SessionLocal을 만들고 요청 완료시, 해당 session을 close() 하는 동작이 반복됩니다.

# backend/main.py

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

from config.database import SessionLocal, engine, Base

Base.metadata.create_all(bind=engine)

app = FastAPI()


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

   

4. 결론

 FastAPI와 MariaDB(MySQL) 연동까지 마쳤습니다. 정말 간단하게 연동만 해보았는데요. 다음에는 User CRUD와 Project의 Structure에 관해 작성해보겠습니다.

반응형