TOP
class="layout-aside-left paging-number">
본문 바로가기
[파이썬 Projects]/<파이썬 웹개발>

[파이썬] 플라스크(Flask) - 데이터베이스 (3)

by 기록자_Recordian 2024. 7. 20.
728x90
반응형
시작에 앞서
해당 내용은 <가장 빠른 풀스택을 위한 Flask & FastAPI>, Dave Lee 지음. BJ Public 출판.
내용을 토대로 작성되었습니다. 보다 자세한 사항은 해당 교재를 참고하시기 바랍니다.

이전 내용
 

[파이썬] 플라스크(Flask) - 데이터베이스 (2)

시작에 앞서해당 내용은 , Dave Lee 지음. BJ Public 출판.내용을 토대로 작성되었습니다. 보다 자세한 사항은 해당 교재를 참고하시기 바랍니다.이전 내용 [파이썬] 플라스크(Flask) - 데이터베이스 (1)

puppy-foot-it.tistory.com


Flask-Migrate

 

Flask-Migrate는 플라스크 애플리케이션에서 SQLAlchemy 데이터베이스를 쉽게 마이그레이션할 수 있도록 도와주는 확장이다.

Alembic을 기반으로 하며, 데이터베이스 스키마의 버전 관리를 효율적으로 수행할 수 있게 도와준다.

 

※ IT 마이그레이션은 데이터나 소프트웨어를 한 시스템에서 다른 시스템으로 이동하는 것이다. IT 마이그레이션은 프로젝트에 따라 데이터 마이그레이션, 애플리케이션 마이그레이션, 운영 체제 마이그레이션, 클라우드 마이그레이션 등 한 가지 이상의 이동이 진행될 수 있다.

 

[Flask-Migrate 사용의 장점]

  • 스키마 변경의 추적: 데이터베이스 스키마가 자주 변경될 수 있으며, 이러한 변경을 버전으로 관리할 필요가 있다.
  • 팀 작업: 여러 개발자가 함께 작업할 때 각자의 로컬 데이터베이스 상태를 일치시켜야 한다.
  • 배포 용이성: 프로덕션 데이터베이스에 새로운 변경을 안전하게 적용할 수 있어야 한다
  • 데이터 손실 방지: 스키마가 변경되더라도 기존 데이터를 보존하면서 안전하게 마이그레이션 할 수 있다.

마이그레이션 파일은 코드 리포지토리에 저장되므로, 팀원과 공유하면 각자의 로컬 환경에서도 동일한 데이터베이스 구조를 유지할 수 있으며, 복잡한 마이그레이션을 수행해야 할 경우, 직접 마이그레이션 파일을 수정하여 더 복잡한 작업을 수행할 수 있다.

 

Flask-Migrate는 데이터베이스의 변경 사항을 효율적으로 관리하고, 팀원 또는 운영 환경과의 일관성을 유지하는 데 큰 도움을 준다.

 

[Flask-Migrate 설치]

터미널에서 아래 명령어를 실행

pip install Flask-Migrate==4.0.5

 

Flask-Migrate 초기 설정은 파일명을 app.py로 작성한다

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
import pymysql
from flask_migrate import Migrate

app = Flask(__name__)
# 데이터베이스 연결 URI 설정
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:password@localhost:3306/db_name'
# mysql://root:[비밀번호]@localhost:[root번호]/[db이름]

# SQLAlchemy 인스턴스 초기화
db = SQLAlchemy()
db.init_app(app)

# 데이터베이스 모델 정의
class User(db.Model):
    # 테이블 이름 직접 지정(생략 시 클래스이름은 'user')
    __tablename__ = 'users'
    
    id = db.Column(db.Integer, primary_key=True) # 사용자 id 기본키로 설정
    username = db.Column(db.String(80), unique=True, nullable=False) # 사용자 이름, 중복 불가 및 필수 입력
    email = db.Column(db.String(120), unique=True, nullable=False) # 이메일 주소, 중복 불가 및 필수 입력
    
    def __repr__(self):
        return '<User %r>' % self.username # 갹체를 문자열로 표현할 때 사용할 형식
    
# Flask-Migrate 초기 설정
migrate = Migrate(app, db)

 

◆ 초기 설정

다음 명령으로 마이그레이션 환경을 초기화 (터미널)

flask db init

이 명령을 실행하면 migrations 라는 폴더가 생성되고, 이 폴더 내에 마이그레이션 파일들이 저장된다.


◆ 마이그레이션 파일 생성

모델에 변경 사항이 생기면, 이 변경 사항을 적용하기 위한 마이그레이션 파일을 생성해야 한다 (터미널)

flask db migrate -m "Initial migration."

이 명령은 migrations 폴더 내에 새로운 마이그레이션 파일을 생성한다.

-m 옵션은 해당 마이그레이션에 대한 메시지를 추가하는 것이다.


◆ 마이그레이션 적용

마이그레이션을 생성한 후, 이를 실제 데이터베이스에 적용해야 한다

flask db upgrade

이 명령을 실행하면, 앞서 생성한 마이그레이션 파일을 바탕으로 데이터베이스 스키마가 변경된다.


◆ 롤백

문제가 생겼을 경우, 아래의 명령어로 이전 상태로 롤백할 수 있다

flask db downgrade

참고로, 특정 버전의 데이터베이스 스키마로도 롤백할 수 있는데, 이는 downgrade 명령어에 버전 번호를 인자로 주는 것으로 가능하다.

 

◆ 현재 데이터베이스의 모든 마이그레이션 버전 확인

version 폴더 내에 각 마이그레이션의 버전이 저장되어 있다. 이 폴더는 일반적으로 migrations/versions 디렉터리에 있는데,  versions 폴더에 있는 각 파일을 오픈하면, Revision ID로 해당 버전을 확인할 수 있다.

 

원하는 버전의 해시를 찾았다면, 다음과 같이 명령을 실행한다

flask db downgrade #<version_hash>

<version_hash>는 롤백하고 싶은 마이그레이션 버전의 해시이다. 이 해시는 일반적으로 마이그레이션 파일 이름의 일부이다.

 

이 기능은 특정 버전의 스키마에 문제가 있을 때나, 이전 버전의 애플리케이션 코드를 사용해야 할 때 유용하게 사용된다.

 

[주의 사항]

flask db downgrade 명령은 데이터베이스 스키마에 대한 변경을 롤백한다. 즉 테이블 구조를 이전 상태로 되돌리는데, 이 명령은 테이블에 저장된 실제 데이터에 대해서는 롤백을 수행하지 않는다.

예를 들어 'age' 라는새로운 컬럼을 'Users' 테이블에 추가했다가 롤백하는 경우, 'age' 컬럼은 삭제되지만 'Users' 테이블의 나머지 데이터는 그대로 유지된다.

  • 데이터 손실: 스키마를 롤백할 때 삭제되는 칼럼이나 테이블에 있는 데이터는 복구되지 않는다
  • 데이터 불일치: 예를 들어 새로운 칼럼에는 NOT NULL 제약 조건이 있고 기본값 설정이 없었다면 롤백 후에는 그 칼럼이 사라지므로 문제가 없지만, 다시 그 상태로 업그레이드하려고 하면 기존 행에는 그 칼럼에 대한 데이터가 없어 문제가 될 수 있다
  • 복잡한 마이그레이션: 데이터 변환과 같은 복잡한 마이그레이션을 수행한 경우, 롤백 스크립트도 그에 맞게 복잡해질 수 있으므로 주의가 필요하다

※ 마이그레이션과 롤백을 수행하기 전에는 반드시 데이터베이스 백업을 해둬야 문제가 발생했을 때 원래 상태로 복구할 수 있다.

728x90
반응형