python/SQLAlchemy

SQLAlchemy 소개 및 활용법

seokhyun2 2022. 8. 21. 20:34

딥러닝 모델을 서비스에 적용하다보면, 실시간 서빙 뿐만 아니라 데이터베이스를 활용하여 데이터베이스에 딥러닝 모델의 인퍼런스 결과를 저장해두고 저장된 결과를 활용하여 서비스를 제공하기도 합니다.

자연어처리에서 예를 들면, 미국 신문 기사에 대한 번역 서비스를 제공한다고 할 때, 미국 신문 기사를 데이터베이스에 저장하면서 번역 결과도 같이 저장을 해둔다면 유저가 접속할 때 마다 번역할 필요가 없겠죠?

그래서 딥러닝 모델을 서비스에 제공하다보면, 데이터베이스에 대한 지식도 필요하게 됩니다.

 

SQLAlchemy?

SQLAlchemy는 그 자체가 데이터베이스 클라이언트는 아닙니다.

데이터베이스 클라이언트 라이브러리는 별도로 활용하고, 오늘 소개드릴 SQLAlchemy는 ORM(Object Relational Mapping)을 사용할 수 있게 도와주는 데이터베이스 관련 툴킷입니다.

ORM?

ORM(Object Relational Mapping)이 무엇인지 간단하게 소개를 해보겠습니다.

ORM은 객체와 데이터베이스의 관계를 매핑해주는 것입니다.

코드에서 Class로 선언하면, 데이터베이스의 스키마를 매핑하여 사용할 수 있습니다.

ORM을 활용하게 되면, 코드의 가독성도 높아지고 코드의 재사용&유지보수에 대한 편리성이 증가하며 비즈니스 로직에 더 집중할 수 있어서 생산성도 올라가는 등의 다양한 장점이 있습니다.

 

SQLAlchemy 사용 방법

환경 설정

우선 데이터베이스가 있어야, 테스트를 할 수 있겠죠?

저는 mysql을 활용해보도록 하겠습니다.

아래의 명령어로 mysql을 도커로 간단하게 세팅할 수 있습니다.

docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123123 --name mysql mysql:5.7

SQLAlchemy는 pip로 간단하게 설치하시면 됩니다.

하지만 SQLAlchemy는 데이터베이스 클라이언트는 아니라고 했기 때문에, 별도로 데이터베이스 클라이언트 라이브러리가 필요합니다.

저는 pymysql을 활용해보도록 하겠습니다.

아래의 명령어로 pymysql과 sqlalchmey를 설치하면 됩니다.

pip install pymysql sqlalchemy

그러면 이제 환경 설정은 끝났습니다.

데이터베이스 연결

이제 데이터베이스 연결을 해보도록 하겠습니다.

from urllib.parse import quote
from sqlalchemy import create_engine

user = "root"
pwd = "123123"
host = "localhost"
port = 3306
db_url = f'mysql+pymysql://{user}:{quote(pwd)}@{host}:{port}'

engine = create_engine(db_url, pool_size=5, max_overflow=5, echo=True)

위와 같이 create_engine을 호출하면, 데이터베이스에 연결할 수 있습니다.

 

db_url에서 맨 앞에 mysql은 데이터베이스의 종류입니다.
mysql 뿐만 아니라, postgresql 등 다른 데이터베이스도 활용할 수 있습니다.
그 뒤에 pymysql은 실제 데이터베이스 클라이언트를 지정해주는 것인데요.
위에서 함께 설치했던 pymysql이 활용됩니다. 

quote() 함수를 활용하는 이유는, 비밀번호에 특수문자가 들어갈 수 있는데 ' " 과 같은 특수 문자가 들어가게 되면 db_url을 생성하는데 버그가 생길 수 있기 때문입니다.

 

SQLAlchemy는 ORM을 제공하는거 외에도 connection pool을 관리해주는 역할도 제공합니다.

기본적인 pymysql을 활용하여 데이터베이스를 연결하면 연결할 때 마다 connection이 생성되는데, 1개를 생성해서 돌려쓰게 되면 데이터베이스에 insert를 크게 하는 코드가 실행되고 있을 때는 다른 작업들이 다 기다려야합니다.

그래서 서버를 띄울 때는 보통 connection을 여러 개 사용하도록 구성하는데요.

SQLAlchemy의 엔진은 connection pool을 자체적으로 관리해줍니다.

그래서 pool_size는 connection pool에서의 connection 갯수를 의미하고, max_overflow는 connection pool의 갯수를 최대로 초과할 수 있는 갯수입니다. connection 갯수가 모자랄 때는 임시로 max_overflow에서 허용하는 범위까지 초과하여 커넥션을 사용하도록 되어 있습니다.

echo 옵션은 query 문을 출력해주는 옵션입니다.

 

이렇게 초기화가 끝났으면, 이제 아래와 같이 execute 함수를 활용하여 query 문을 실행할 수 있습니다.

engine.execute("select 1")

 

오늘은 SQLAlchemy를 간단하게 소개하고, 데이터베이스에 연결해서 query문을 실행하는 방법까지 알아보았습니다.

다음 글에서는 SQLAlchemy의 최대 장점인 ORM을 활용하는 방법에 대해서 알아보도록 하겠습니다. 

'python > SQLAlchemy' 카테고리의 다른 글

SQLAlchemy ORM & async 활용 (2.0.X)  (0) 2023.02.26
SQLAlchemy에서 ORM 활용하기  (0) 2022.09.04