Django 마이그레이션 개요
Sentry는 데이터베이스 스키마 변경을 관리하기 위해 Django 마이그레이션을 활용합니다. 이 메커니즘은 애플리케이션 모델의 변경사항을 데이터베이스에 반영하는 구조화된 접근 방식을 제공합니다.
마이그레이션 명령어
데이터베이스 최신 버전 업그레이드
sentry upgrade
또는 직접 마이그레이션 실행:
sentry django migrate
특정 마이그레이션으로 이동
sentry django migrate <앱_이름> <마이그레이션_이름>
예시: sentry django migrate sentry 0005
SQL 문 생성
sentry django sqlmigrate <앱_이름> <마이그레이션_이름>
새 마이그레이션 생성
sentry django makemigrations [앱_이름]
빈 마이그레이션 생성:
sentry django makemigrations <앱_이름> --empty
마이그레이션 운영 가이드라인
대용량 데이터 처리
대규모 테이블 처리 시 메모리 효율적인 접근:
from sentry.utils.query import RangeQuerySetWrapperWithProgressBar
for item in RangeQuerySetWrapperWithProgressBar(ProjectEnvironment.objects.all()):
if item.environment_name == 'default':
# 처리 로직
인덱스 생성
대규모 테이블에 동시 인덱스 생성:
class Migration(migrations.Migration):
atomic = False
operations = [
migrations.RunSQL("CREATE INDEX CONCURRENTLY ...")
]
컬럼 삭제 절차
다단계 삭제 프로세스:
- NULL 허용으로 표시 후 배포
- 모델에서 컬럼 제거 (데이터베이스 작업 없음)
- 실제 컬럼 삭제 마이그레이션 생성 및 배포
operations = [
migrations.SeparateDatabaseAndState(
database_operations=[
migrations.RunSQL("ALTER TABLE ... DROP COLUMN ...")
],
state_operations=[]
)
]
테이블 삭제 절차
- 외래 키 제약 조건 제거
- 모델 참조 제거 (상태만 업데이트)
- 테이블 삭제 마이그레이션 배포
NOT NULL 제약조건 추가
ALTER TABLE tbl ADD CONSTRAINT cnstr CHECK (col IS NOT NULL) NOT VALID;
ALTER TABLE tbl VALIDATE CONSTRAINT cnstr;
새 컬럼 추가
NULL 허용 컬럼 추가와 Django 기본값 분리:
operations = [
migrations.SeparateDatabaseAndState(
database_operations=[
migrations.AddField(..., null=True)
],
state_operations=[
migrations.AddField(..., default=1)
]
)
]
컬럼 유형 변경
안전한 변경 사례:
- varchar 크기 증가
- varchar → text 변환
- numeric 정밀도 증가 (동일 스케일)