📌 개념 정리
Flask-Migrate란?
Flask-Migrate는 Alembic을 기반으로 한 Flask 애플리케이션에서 데이터베이스 마이그레이션을 관리하는 확장입니다. 데이터베이스의 구조나 테이블, 컬럼 등 스키마에 변경이 있을 때마다 이를 추적하고, 변경사항을 코드로 관리할 수 있게 돕습니다. 마이그레이션 파일은 버전 관리 시스템에 포함되어 이력을 기록할 수 있습니다. 이를 통해 데이터베이스를 자동으로 업그레이드하거나 이전 상태로 되돌리는 작업이 가능합니다.
🚦 동작 원리 및 구조
Flask-Migrate의 핵심은 Alembic을 사용해 데이터베이스의 구조 변화를 추적하고 관리하는 것입니다. 모델에 대한 변경사항이 있을 때마다 flask db migrate 명령어로 마이그레이션 파일을 생성하고, flask db upgrade 명령어로 실제 데이터베이스에 적용합니다.
1. flask db init: 프로젝트를 처음 설정할 때 사용되며, migrations 디렉토리를 생성하고 초기화 작업을 합니다.
2. flask db migrate: 모델에 변경사항이 생기면 마이그레이션 파일을 생성합니다.
3. flask db upgrade: 생성된 마이그레이션을 데이터베이스에 적용하여 최신 스키마로 업그레이드합니다.
4. flask db downgrade: 필요 시, 마이그레이션을 되돌려 이전 상태로 복원할 수 있습니다.
💻 코드 예시 및 흐름 분석
Flask-Migrate 설치
Flask-Migrate를 설치하려면 다음 명령어를 사용합니다:
pip install Flask-Migrate
Flask-Migrate 설정
Flask 애플리케이션에서 Flask-Migrate를 설정하는 코드 예시입니다:
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///app.db'
db = SQLAlchemy(app)
migrate = Migrate(app, db)
- Migrate 객체는 Flask 애플리케이션과 SQLAlchemy 데이터베이스 인스턴스를 연결하여 데이터베이스 마이그레이션을 관리합니다.
초기 마이그레이션 생성
초기 마이그레이션 파일을 생성하려면 flask db init 명령어를 실행합니다:
flask db init
이 명령어는 migrations 디렉토리와 관련 설정 파일을 생성합니다. 마이그레이션이 활성화되면 데이터베이스 스키마 변경을 코드로 관리할 수 있습니다.
모델 변경 후 마이그레이션 생성
모델을 변경하고 마이그레이션 파일을 생성하려면 다음 명령어를 사용합니다:
flask db migrate -m "Added email to User and created_at to Board."
- -m 옵션을 사용해 마이그레이션 메시지를 추가할 수 있습니다.
- flask db migrate 명령어는 데이터베이스 모델과 현재 데이터베이스 상태를 비교하여 마이그레이션 스크립트를 생성합니다.
마이그레이션 적용
생성된 마이그레이션 파일을 데이터베이스에 적용하려면 flask db upgrade 명령어를 사용합니다:
flask db upgrade
- flask db upgrade 명령어는 마이그레이션 스크립트를 실행하여 실제로 데이터베이스를 업데이트합니다.
모델 필드 추가 후 예시
class User(db.Model):
__tablename__ = "users"
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(100), unique=True, nullable=False)
email = db.Column(db.String(100), unique=True, nullable=False)
class Board(db.Model):
__tablename__ = "boards"
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(100), nullable=False)
content = db.Column(db.String(200))
user_id = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=False)
author = db.relationship('User', back_populates='boards')
변경 후 마이그레이션을 생성하고 적용하는 과정은 위에서 설명한 **flask db migrate**와 flask db upgrade 명령어를 통해 이루어집니다.
🧪 실전 사례
예를 들어, User 모델에 email 필드를 추가하거나, Board 모델에 created_at 필드를 추가하는 경우 마이그레이션을 생성하여 데이터베이스에 변경을 적용할 수 있습니다. 모델을 수정한 후 flask db migrate 명령어로 마이그레이션 파일을 생성하고, flask db upgrade 명령어로 적용하여 데이터베이스 스키마를 업데이트합니다.
🧠 고급 팁 or 자주 하는 실수
자주 하는 실수:
- 마이그레이션 파일이 생성되지 않는 경우: 모델 변경 후 flask db migrate 명령어가 제대로 실행되지 않으면, **flask db upgrade**를 실행할 수 없습니다. 이 경우 마이그레이션 파일을 다시 생성하고 확인해야 합니다.
고급 팁:
- 커스텀 마이그레이션 파일 작성: 복잡한 데이터베이스 변경이 필요한 경우, Alembic을 사용하여 직접 마이그레이션 파일을 작성할 수 있습니다. Alembic의 op.create_table 또는 **op.add_column**과 같은 기능을 활용해 더 세밀한 제어가 가능합니다.
✅ 마무리 요약 및 복습 포인트
- Flask-Migrate는 Alembic을 사용하여 Flask 애플리케이션의 데이터베이스 마이그레이션을 관리합니다.
- 데이터베이스 모델에 대한 변경사항을 추적하고, 이를 코드로 관리할 수 있습니다.
- flask db init, flask db migrate, flask db upgrade 명령어를 통해 마이그레이션 파일을 생성하고 데이터베이스에 적용할 수 있습니다.
- 데이터베이스 스키마 변경을 쉽게 관리하고, 이전 상태로 복원할 수 있는 flask db downgrade 기능도 지원합니다.
'Flask' 카테고리의 다른 글
Chapter 4-3 실습_블로그 구현 (Flask-MySQL를 활용) templates/posts.html (0) | 2025.04.22 |
---|---|
Chapter 4-2 실습_블로그 구현 (Flask-MySQL를 활용) (0) | 2025.04.22 |
Chapter 3-12 Flask 개념 정리 (0) | 2025.04.21 |
Chapter 3-11 직렬화(Serialization) & 역직렬화(Deserialization) (0) | 2025.04.21 |
Chapter 3-10 Schema & Model 차이 (0) | 2025.04.21 |