나는 BERT 감성분석 프로젝트를 진행하며, fast api를 활용하여 DB,백을 구축하였다.
지금 DB 실시간 연동을 위해 다시 코드를 뜯어보는 중인데,
Fast API와 DB를 연결하는 방법에 대해 작성해보겠다.
ORM이란 객체 관계 매핑(Object Relational Mapping)으로 데이터베이스 내의 테이블들을 객체화하여 각 DBMS에 대해서 CRUD 등을 공통된 접근 기법으로 사용할 수 있다.
하나의 객체를 다루기 위해 여러 SQL 쿼리가 사용되기에 프로그램이 커지면 작성해야하는 SQL 쿼리 또한 많아진다.
반복되는 쿼리를 객체 단위로 생성해서 이를 해결하고자 탄생한 것이 ORM이다.
ORM을 사용하게 되면 따로 SQL문을 작성할 필요없이 객체를 통해 간접적으로 데이터베이스를 조작할 수 있습니다.
이러한 ORM의 대표적인 예시가 Python ORM, SQLAlchemy 등...
장점
1. 개발 생산성 증가
2. 유지보수 편리
3. 데이터 구조 변경이 일어날 시, 객체에 대한 변경만 이루어지면 되므로 유지보수가 편리
4. 코드 가독성 상승
단점
1. 호출방식에 따라 성능이 크게 차이가 있음
2. 복잡한 쿼리 작성 시, ORM에 대한 난이도 증가
3. DBMS 고유 기능 모두 사용하지 못함.
파이썬 ORM 라이브러리에서 가장 많이 사용되는 패키지
SQLAlchemy는 파이썬 코드에서 DB와 연결하기 위해 사용
SQLAlchemy는 DB 테이블을 프로그래밍 언어의 클래스로 표현해주고 테이블의 CRUD를 돕는다.
SQLAlchemy를 사용하면 sql 쿼리를 작성하지 않아도 프로그램이 언어로 객체간의 관계를 표현해 줌!
따라서, SQLAlchemy로 model을 정의하고 정의한 모델을 테이블과 mapping할 수 있는 여러가지 방법을 쉽게 구현 가능
=>
1) DB 종류와 상관없이 일관된 코드를 유지
2) 유지 보수가 편리
3) SQL쿼리를 내부에서 자동으로 생성해주므로 쿼리 오류 문제 발생 X
디렉터리 구조
.
├── app.py
├── models.py
└── database.py
필요 모듈 설치
pip install fastapi
pip install pydantic
pip install SQLAlchemy
pip install mysql
: 기존에 존재하는 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
: 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)
database.py에 저장되어 있는 db 정보들을 이용해 db 세션을 열어서 연결
기존 db와 매핑된 models.py를 가져온 후
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
uvicorn app:app --reload