마이그레이션을 통한 DB스키마 관리

guava·2021년 11월 28일
0

파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트 강의를 듣고 정리한 글입니다.

Migrations


마이그레이션 명령

: 모델의 변경내역데이터베이스 스키마로 반영시키는 명령

# 마이그레이션 파일 생성
python manage.py makemigrations <app_name>

# 지정 DB에 마이그레이션 적용
python manage.py migrate <app_name>

# 마이그레이션 적용 현황 출력
python manage.py showmigrations <app_name>

# 지정 마이그레이션의 SQL 내역 출력
python manage.py sqlmigrate <app_name> <migration_file_name>

언제 makemigrations를 하는가?
모델 필드 관련된 어떠한 변경 사항이라도 발생 시에 마이그레이션 파일을 생성하자.
실제로 DB 스키마에 가해지는 변화가 없더라도 수행하라
마이그레이션 파일은 모델의 변경사항을 누적하는 역할이다.
스키마의 변화만 기록하기에 절대로 삭제하면 안된다

마이그레이션 파일

  • 데이터베이스에 변화를 가하는 Operation들이 나열되어 있다.
  • makemigrations 명령에 의해 자동으로 생성된다.
  • 같은 Migration 파일이라 할지라도 DB종류에 따라 다른 SQL이 생성된다.

마이그레이션 적용 루틴

  1. 모델 변경 내역이 발생한다.
  2. makemigrations 명령을 통해 마이그레이션 파일 #1을 생성한다.
    python manage.py makemigrations <app_name>
  3. showmigrations 명령을 통해 모든 마이그레이션 파일 내역 및 적용 여부까지 확인한다.
    python manage.py showmigrations <app_name>
  4. sqlmigrate 명령을 통해 적용할 마이그레이션 파일(#1)에 대한 SQL 내역을 확인한다.
    python manage.py sqlmigrate <app_name> <migration_file_name>
  5. migrate 명령을 통해 DB에 적용한다.
    python manage.py migrate <app_name>

Migrate


python manage.py migrate <앱이름>
# 정방향으로 순차작으로 수행하는 명령이다.
python manage.py migrate <앱이름> <마이그레이션-이름>
# 지정된 <마이그레이션-이름>이 현재 적영된 마이그레이션보다
# 이후라면, 정방향으로 순차적으로 지정 마이그레이션까지 수행
# 이전이라면, 역방향으로 순처작으로 지정 마이그레이션 이전까지 수행

정/역방향 적용

다음과 같이 마이그레이션 파일 1~5까지만 DB에 적용되어 있다고 하자.
1[x], 2[x], 3[x], 4[x], 5[x], 6[ ], 7[ ]

  • 만약 python manage.py migrate <앱이름> 명령을 수행하면 6이 적용되고 7이 적용된다.
  • 만약 마이그레이션 이름을 7로 명령(python manage.py migrate <앱이름> <마이그레이션-이름>)을 적용하면 6, 7이 순차적으로 적용된다.
  • 만약 마이그레이션 이름을 3로 명령(python manage.py migrate <앱이름> <마이그레이션-이름>)을 적용하면 5, 4가 순차적으로 취소된다.

migrate 이름 지정

  • 중복되는 이름이 되지 않도록만 지정하면 된다.
    • 0001_initial.py가 있다면 0001까지만 지정하면 된다. 다만 0001로 시작하는 파일이 2개가 있다면 Fail이다.
  • python manage.py migrate <app_name> zero를 실행하면 앱의 모든 마이그레이션을 rollback한다.

TIP


협업

  • 팀원 각자가 마이그레이션을 생성하면 충돌이 발생한다.
  • 마이그레이션 파일 생성은 1명이 전담해서 생성하자. 생성한 파일을 버전관리에 넣고 다른 팀원이 이를 받아 migrate만 수행하자.

마이그레이션 다수 생성

서버에 바로 반영하지 말고, 하나의 마이그레이션으로 합쳐서 적용하기를 권장

마이그레이션 합치기

방법1

  1. 서버로의 미적용 마이그레이션을 모두 롤백
  2. 롤백된 마이그레이션들을 모두 제거
  3. 새로운 마이그레이션을 생성

방법2

squashmigrations 명령을 통해 미적용 마이그레이션을 모두 합친다.

0개의 댓글