Sentry 개발자를 위한 데이터베이스 마이그레이션 관리

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 ...")
    ]

컬럼 삭제 절차

다단계 삭제 프로세스:

  1. NULL 허용으로 표시 후 배포
  2. 모델에서 컬럼 제거 (데이터베이스 작업 없음)
  3. 실제 컬럼 삭제 마이그레이션 생성 및 배포
operations = [
    migrations.SeparateDatabaseAndState(
        database_operations=[
            migrations.RunSQL("ALTER TABLE ... DROP COLUMN ...")
        ],
        state_operations=[]
    )
]

테이블 삭제 절차

  1. 외래 키 제약 조건 제거
  2. 모델 참조 제거 (상태만 업데이트)
  3. 테이블 삭제 마이그레이션 배포

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 정밀도 증가 (동일 스케일)

태그: Django Sentry 데이터베이스 마이그레이션 PostgreSQL

6월 14일 19:03에 게시됨