본문 바로가기
Dev DBAN/개발 이야기

FAST API로 REST API만들기 - SQLAlchemy

by 디반 2021. 12. 13. 12:52
반응형

FastAPI로 REST API 만들기

2. SQLAlchemy

 

 

저번 포스팅에 이어서 오늘은 SQLAlchemy를 이용해 DB와 연동해 데이터 저장, 조회를 해보려고 합니다.

프로젝트 폴더를 클릭해 New -> Python file -> db_conn 으로 파이썬 파일을 생성 시켜 줍니다.

 

그 다음 SQLAlchemy 라이브러리를 다운로드 받아서 가져와야되겠죠?

# SQLAlchemy 라이브러리 설치

pip install sqlalchemy

 

이제 우리는 SQLAlchemy로 데이터 베이스에 접속 할 예정입니다.

하지만 아직 어떤 데이터 베이스도 만들어 두지 않았기에 우리는 mysql을 접속해 데이터 베이스를 하나 생성하도록 하겠습니다. 

저는 데이터 그립을 이용해서 DB를 생성하지만 여러분들은 없을 수도 있으니 아래에 SQL쿼리문도 같이 작성하도록 하겠습니다.

# 데이터 베이스 생성

create schema testdb

 

데이터 베이스를 만들고 테이블을 생성해줍니다.

# 데이터 베이스 생성

create table test
(
	id bigint auto_increment,
	name TEXT not null,
	number int not null,
	constraint test_pk
		primary key (id)
);

 

데이터 베이스를 생성을 했으니 이제 SQLAlchemy로 데이터 베이스에 연결을 한 번 해보도록 하겠습니다.

그리고 연결을 할 때 pymysql을 이용해 연결을 하기 때문에 pymysql 라이브러리도 같이 다운로드 받도록 하겠습니다.

# 파이썬 라이브러리 pymysql 설치

pip install pymysql

from sqlalchemy import *
from sqlalchemy.orm import sessionmaker

# 
app = {
        'name': 'mysql+pymysql',
        'user': 'root',
        'password': '내 DB 비밀번호',
        'host': 'localhost',
        'dbconn': 'testdb',
        'port': '3306'
    }

conn_string=f'{app["name"]}://{app["user"]}:{app["password"]}@{app["host"]}:{app["port"]}/{app["dbconn"]}'

class engineconn:

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

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

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

 

DB 연결 부분을 만들었다면 이제 이 연결 부분을 가지고 API와 연동해서 활용해보도록 하겠습니다.

조금 더 자세한 사항을 알고 싶다면 SQLAlchemy 공식 문서를 참고 하세요!

 

 

MySQL and MariaDB — SQLAlchemy 1.4 Documentation

CREATE TABLE arguments including Storage Engines Both MySQL’s and MariaDB’s CREATE TABLE syntax includes a wide array of special options, including ENGINE, CHARSET, MAX_ROWS, ROW_FORMAT, INSERT_METHOD, and many more. To accommodate the rendering of the

docs.sqlalchemy.org

 

그 다음으로 SQLAlchemy를 쓰기 전 ORM에 대해서 알고 있어야되는데 ORM에 대해 간략하게 설명을 하자면 

ORM은 (Object Relational Mapping) :객체-관계 매핑 객체와 관계형 데이터베이스의 데이터를 자동으로 매핑(연결)해주는 것을 말한다.

즉 직접 SQL 쿼리를 작성하지 않고 객체 지향 프로그래밍언어인 파이썬코드로 SQL쿼리를 생성해 자동으로 연결 시켜 주는 그런 방법이라고 이해한다면 될 것 같다 

이에 대해 보다 자세한 사항은 이 글을 참고 하자 

이제 또 새로운 파일을 하나 더 만들 겁니다.

이름은 db_class.py로 상속된 클래스들을 자동으로 매핑시켜주는 declarative_base를 이용할겁니다.

from sqlalchemy import Column, TEXT, INT, BIGINT
from sqlalchemy.orm 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)

 

테이블까지 매핑을 시켰다면 이제 우리는 main.py로 다시 되돌아가서 API가 실행 될때마다 데이터베이스에 접속해 데이터를 조회하는 것을 한 번 해볼겁니다.

from fastapi import FastAPI
from pydantic import BaseModel
from db_conn import engineconn
from db_class 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

@app.post("/post")
async def first_post(item:Item):
    return item

 

정상적으로 호출이 된다면 데이터 베이스에 아무런 데이터가 없기에 [ ] 비어있는 값으로 출력이 될텐데 이제 우리는 데이터베이스에 POST를 이용해 데이터를 만들어 보도록 하겠습니다.

from fastapi import FastAPI
from pydantic import BaseModel
from db_conn import engineconn
from db_class 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

@app.post("/post")
async def first_post(item:Item):
    addMemo = Test(name=item.name, number=item.number)
    session.add(addMemo)
    session.commit()
    return item

 

POST로 호출해 데이터가 저장이 되었는지 확인하기 위해 데이터 베이스를 한 번 확인해보겠습니다.

성공적으로 추가된 데이터

 

데이터를 그럼 한 번 조회해볼까요?

 

 

FastAPI에 SQLAlchemy를 연동해서 GET과 POST를 한 번 구현해보았습니다. 

다음 포스팅에서는 FastAPIRouter를 이용한 캡슐화를 한 번 진행해보도록 하겠습니다. 

그럼 다음 시간에 만나요!

 

반응형

댓글


"); wcs_do();