시작에 앞서
해당 내용은 <가장 빠른 풀스택을 위한 Flask & FastAPI>, Dave Lee 지음. BJ Public 출판.
내용을 토대로 작성되었습니다. 보다 자세한 사항은 해당 교재를 참고하시기 바랍니다.
이전 내용
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 제약 조건이 있고 기본값 설정이 없었다면 롤백 후에는 그 칼럼이 사라지므로 문제가 없지만, 다시 그 상태로 업그레이드하려고 하면 기존 행에는 그 칼럼에 대한 데이터가 없어 문제가 될 수 있다
- 복잡한 마이그레이션: 데이터 변환과 같은 복잡한 마이그레이션을 수행한 경우, 롤백 스크립트도 그에 맞게 복잡해질 수 있으므로 주의가 필요하다
※ 마이그레이션과 롤백을 수행하기 전에는 반드시 데이터베이스 백업을 해둬야 문제가 발생했을 때 원래 상태로 복구할 수 있다.
'[파이썬 Projects] > <파이썬 웹개발>' 카테고리의 다른 글
[파이썬] 플라스크(Flask) - 인증과 세션(2) (0) | 2024.07.21 |
---|---|
[파이썬] 플라스크(Flask) - 인증과 세션(1) (3) | 2024.07.20 |
[파이썬] 플라스크(Flask) - 데이터베이스 (2) (0) | 2024.07.18 |
[파이썬] 플라스크(Flask) - 데이터베이스 (1) (0) | 2024.07.16 |
[파이썬] 플라스크(Flask) - 로깅 (0) | 2024.07.16 |