[파이썬] Tornado에서의 데이터베이스 마이그레이션

데이터베이스 마이그레이션은 소프트웨어 개발 프로세스에서 중요한 단계입니다. 특히 웹 애플리케이션을 개발하는 경우 데이터베이스 스키마의 변경이 빈번하게 발생할 수 있습니다. 이러한 변경사항을 관리하고, 데이터베이스를 업데이트하는 작업은 프로덕션 환경에서 조심스럽게 수행되어야 합니다.

Tornado는 Python으로 개발된 비동기 웹 프레임워크로, 데이터베이스 마이그레이션을 간단하게 수행할 수 있는 기능을 제공합니다. Tornado를 사용하여 데이터베이스 마이그레이션을 수행하는 방법을 알아보겠습니다.

SQLAlchemy를 사용한 데이터베이스 설정

먼저 Tornado에서 데이터베이스를 사용하기 위해 SQLAlchemy를 설정해야 합니다. SQLAlchemy는 Python에서 가장 인기 있는 ORM(Object-Relational Mapping) 도구 중 하나로, Tornado에서도 많이 사용됩니다.

데이터베이스 연결 및 세션을 관리하기 위해 다음과 같이 SQLAlchemy 설정을 추가합니다:

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker

# 데이터베이스 연결 설정
engine = create_engine('postgresql://username:password@localhost/database_name')

# 세션 생성
Session = sessionmaker(bind=engine)
db_session = Session()

위 코드에서는 PostgreSQL 데이터베이스에 연결하는 예제를 보여주었습니다. 필요에 따라 다른 데이터베이스와의 연결 설정을 사용하십시오.

Alembic을 사용한 마이그레이션 스크립트 작성

Tornado에서 데이터베이스 마이그레이션을 수행하기 위해 Alembic을 사용할 수 있습니다. Alembic은 SQLAlchemy의 마이그레이션 도구로, 간단한 명령을 통해 데이터베이스 스키마를 변경하고 관리할 수 있습니다.

먼저 Alembic을 설치한 후, 데이터베이스 마이그레이션을 위한 초기 설정을 수행해야 합니다. 다음 명령을 실행하여 Alembic 설정을 생성합니다:

alembic init alembic

위 명령을 실행한 후, alembic 디렉토리 내에 alembic.ini 파일과 env.py 스크립트가 생성됩니다.

다음으로, 데이터베이스 마이그레이션을 위한 서브디렉토리를 생성합니다:

alembic revision -m "create my_table"

위 명령을 실행하면 alembic/versions 디렉토리 내에 마이그레이션 스크립트 파일이 생성됩니다. 해당 파일을 열고 스키마 변경 작업을 작성합니다. 예를 들어, my_table 테이블을 생성하는 마이그레이션 스크립트는 다음과 같을 수 있습니다:

from alembic import op
import sqlalchemy as sa


def upgrade():
    op.create_table('my_table',
        sa.Column('id', sa.Integer, primary_key=True),
        sa.Column('name', sa.String(50), nullable=False)
    )


def downgrade():
    op.drop_table('my_table')

위 스크립트는 upgrade 함수에서 my_table 테이블을 생성하고, downgrade 함수에서 해당 테이블을 삭제합니다. 마이그레이션 스크립트를 작성할 때 주의할 점은, 스키마 변경이 롤백 가능하도록 ‘downgrade’ 함수를 작성하는 것입니다.

터미널에서 마이그레이션 스크립트 실행

마이그레이션 스크립트를 작성한 후, 다음 명령을 실행하여 실제 데이터베이스에 변경을 적용합니다:

alembic upgrade head

위 명령은 최신 버전의 마이그레이션 스크립트까지 차례로 적용합니다.

Tornado 애플리케이션에서 데이터베이스 사용

마이그레이션 스크립트를 실행한 후, Tornado 애플리케이션에서 데이터베이스를 사용할 수 있습니다. 위에서 설정한 SQLAlchemy 연결을 사용하여 데이터베이스에 쿼리를 실행하는 예제 코드는 다음과 같습니다:

import tornado.ioloop
import tornado.web

class MainHandler(tornado.web.RequestHandler):
    def get(self):
        result = db_session.execute("SELECT * FROM my_table")
        self.write(str(result.fetchall()))

def make_app():
    return tornado.web.Application([
        (r'/', MainHandler),
    ])

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

위 코드에서는 / 경로로 요청이 오면 my_table 테이블의 모든 데이터를 조회하여 응답합니다.

결론

Tornado에서 데이터베이스 마이그레이션을 수행하기 위해 SQLAlchemy과 Alembic을 사용하는 방법에 대해 알아보았습니다. SQLAlchemy을 사용하여 데이터베이스 연결을 설정하고, Alembic을 사용하여 마이그레이션 스크립트를 작성하고 실행하는 방법을 설명했습니다. 마이그레이션 스크립트를 작성할 때는 ‘upgrade’와 ‘downgrade’ 함수를 적절하게 작성하여 롤백 가능한 변경을 수행하도록 주의해야 합니다.

데이터베이스 마이그레이션은 데이터 일관성과 안정성을 유지하는 데 중요한 역할을 합니다. Tornado의 데이터베이스 마이그레이션 기능을 활용하여 웹 애플리케이션의 데이터베이스 스키마 변경을 쉽게 관리할 수 있습니다.