[python] Tornado와 SQLAlchemy를 이용한 데이터베이스 연동

소개

Tornado와 SQLAlchemy는 웹 개발에서 널리 사용되는 파이썬 라이브러리입니다. Tornado는 비동기 웹 서버 프레임워크이며, SQLAlchemy는 데이터베이스 ORM(Object-Relational Mapping) 라이브러리입니다.

이번 포스트에서는 Tornado와 SQLAlchemy를 함께 사용하여 데이터베이스를 연동하는 방법을 소개하겠습니다.

사전 준비

먼저, Tornado와 SQLAlchemy를 설치해야 합니다. 아래의 명령어를 사용하여 설치할 수 있습니다.

pip install tornado sqlalchemy

또한, 데이터베이스에 접속하기 위해 필요한 정보를 알고 있어야 합니다. 호스트, 포트, 사용자 이름, 비밀번호, 데이터베이스 이름 등의 정보를 알고 있는지 확인해주세요.

SQLAlchemy 모델 정의

SQLAlchemy를 사용하여 데이터베이스 모델을 정의해야 합니다. 예를 들어, ‘User’ 모델을 정의해보겠습니다.

from sqlalchemy import Column, String
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

class User(Base):
    __tablename__ = 'users'
    
    id = Column(String, primary_key=True)
    name = Column(String)
    email = Column(String)

위의 코드에서 User 클래스는 users 테이블과 연결됩니다. id, name, email은 각각 String 타입의 열(column)입니다. id는 기본 키(primary key)로 설정되어 있습니다.

Tornado 핸들러

Tornado에서는 핸들러(handler) 클래스를 통해 웹 요청을 처리합니다. 데이터베이스 연동을 위해서는 해당 핸들러에 SQLAlchemy 세션이 필요합니다. 아래는 데이터베이스 연동을 위한 핸들러의 예입니다.

from tornado.web import RequestHandler
from sqlalchemy.orm import sessionmaker

class UserHandler(RequestHandler):
    def initialize(self, engine):
        Session = sessionmaker(bind=engine)
        self.db = Session()
        
    def get(self, user_id):
        user = self.db.query(User).filter_by(id=user_id).first()
        if user:
            self.write(f"User ID: {user.id}, Name: {user.name}, Email: {user.email}")
        else:
            self.write("User not found")

위의 코드에서 UserHandler 클래스는 RequestHandler를 상속받습니다. initialize 메소드에서 SQLAlchemy 엔진을 전달받아 세션을 생성합니다. get 메소드에서는 받은 유저 아이디로 데이터베이스에서 해당 유저를 조회합니다.

Tornado 애플리케이션 설정

마지막으로, Tornado 애플리케이션에서 데이터베이스 연동을 설정해야 합니다.

from tornado.ioloop import IOLoop
from tornado.web import Application
from sqlalchemy import create_engine

# SQLAlchemy 엔진 생성
engine = create_engine('sqlite:///database.db')

# Tornado 애플리케이션 설정
app = Application([
    (r"/user/(\d+)", UserHandler),
])

# SQLAlchemy 세션 전달
app.settings["db_engine"] = engine

if __name__ == '__main__':
    app.listen(8888)
    IOLoop.current().start()

위의 코드에서는 sqlite 데이터베이스를 사용하는 예제입니다. create_engine 함수를 사용하여 데이터베이스에 연결하고, 애플리케이션 설정에서 SQLAlchemy 엔진을 전달합니다.

결론

이제 Tornado와 SQLAlchemy를 함께 사용하여 데이터베이스를 연동하는 방법을 알게 되었습니다. Tornado 핸들러에서 SQLAlchemy 세션을 사용하여 데이터베이스에 접근하고, SQLAlchemy 모델을 사용하여 데이터를 조작할 수 있습니다.

더 자세한 내용은 Tornado 공식 문서SQLAlchemy 공식 문서를 참고해주세요.