본문 바로가기
Python/API

[FastAPI] FastAPI와 DB(MySQL) 연결하기

by JONGSKY 2022. 11. 30.
728x90
SMALL

1. 이 글의 목표

 

이미 존재하는 별도의 MySQL DB를 FastAPI에서 ORM을 이용해서 가져올 수 있다.

 

 

2. FastAPI와 MySQL(DB) 연결하기

 

- 디렉터리 구조

.
├── app.py
├── models.py
└── database.py

 

- 필요 모듈 설치

 

pip install fastapi
pip install pydantic
pip install SQLAlchemy
pip install mysql

 

 

- database.py

: 기존에 존재하는 database를 sqlalchemy를 이용해 연결해주는 파일

 

from sqlalchemy import *
from sqlalchemy.orm import sessionmaker

DB_URL = 'mysql+pymysql://{USERNAME}:{PASSWORD}@{HOST}:{PORT}/{DBNAME}'

class engineconn:

    def __init__(self):
        self.engine = create_engine(DB_URL, pool_recycle = 500)

    def sessionmaker(self):
        Session = sessionmaker(bind=self.engine)
        session = Session()
        return session

    def connection(self):
        conn = self.engine.connect()
        return conn

 

- models.py

: database.py에서 연결한 db를 테이블과 매핑시키는 역할

 

from sqlalchemy import Column, TEXT, INT, BIGINT
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

class Test(Base):
    __tablename__ = "test"

    id = Column(BIGINT, nullable=False, autoincrement=True, primary_key=True)
    name = Column(TEXT, nullable=False)
    number = Column(INT, nullable=False)

 

- app.py

   1. database.py에 저장되어 있는 db 정보들을 이용해 db 세션을 열어서 연결하고

   2. 기존 db와 매핑된 models.py를 가져와서

   3. query를 이용해 filter를 설정해서 db 값을 가져오기

 

from fastapi import FastAPI, Depends, Path, HTTPException
from pydantic import BaseModel
from database import engineconn
from models import Test

app = FastAPI()

engine = engineconn()
session = engine.sessionmaker()


class Item(BaseModel):
    name : str
    number : int

@app.get("/")
async def first_get():
    example = session.query(Test).all()
    return example

 

 

3. 결과확인하기

uvicorn app:app --reload

 

 

4. 마치면서

 

FastAPI에서 ORM을 활용해 불러오는 방법을 찾아냈다.

Django에서는 기존에 db를 연결하면 models.py를 기존 db형태로 만들어주는 코드가 있었는데

FastAPI에서도 있는지 확인해보아야겠다.

(이미 테이블이 수십 개라 수작업은 불가능...)

 

그리고 나중에는 ORM을 이용해 filter 적용을 해서

어떻게 하면 빠르게 DB를 조회할 수 있는지 공부해보고 싶다.

가능하면 나중에 또 포스팅해봐야지...!

728x90
LIST