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

1 분 소요

Migrations

모델의 변경내역을 “데이터베이스 스키마“로 반영시키는 효율적인 방법

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

# 지정 데이터베이스에 마이그레이션 적용
python manage.py migrate <앱이름>

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

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

Migration 파일

  • 데이터베이스에 어떤 변화를 가하는 Operation들을 나열
  • 대개 모델로부터 자동 생성 -> makemigrations 명령
  • 같은 Migration 파일이라 할지라도, DB종류에 따라 다른 SQL이 생성됨.

언제 makemigrations를 하는가

  • 필드관련된 변경사항이 발생시
  • DB스키마에 가해지는 변화가 없어도 수행
  • 마이그레이션 파일은 모델의 변경내역을 누적하는 역할
  • 절대 삭제 금지

Migrate

python manage.py migrate <앱이름>
# 미적용 <마이그레이션-파일>부터 <최근-마이그레이션-파일>까지 정방향으로 순차 진행

python manage.py migrate <앱이름> <마이그레이션-이름>
# 지정된 <마이그레이션-이름>이 현재 적용된 마이그레이션보다
# 이후라면 -> 정방향으로 지정 마이그레이션까지 forward 수행
# 이전이라면 -> 역방향으로 지정 마이그레이션 이전까지 backward 수행

마이그레이션 이름 지정

중복되는 이름이 하나인 경우에만 OK

/shop/migrations/0001_initial.py
/shop/migrations/0002_create_field.py
/shop/migrations/0002_update_field.py

python manage.py migrate blog 000 # FAIL
python manage.py migrate blog 0001 # OK

새로운 필드가 필수 필드라면?

  • 필수필드 여부 : blank/null 옵션이 모두 False일 때(default)

  • makemigrations 명령을 수행할 때, 기존 Record들에 어떤 값을 채워넣을 지 물음

협업 Tip

  • 각자가 마이그레이션 파일 생성 -> 충돌 발생 (절대 하면 안됨)

  • 추천) 마이그레이션 파일 생성은 1명이 전담해서 생성

    • 버전관리에 넣고, 다른 팀원들은 이를 받아서 migrate만 수행

개발시 “서버에 아직 반영하지않은” 마이그레이션을 다수 생성했다면?

  • 이를 그대로 서버에 반영(migrate)하지말고,
  • 하나의 마이그레이션으로 합쳐서 적용
    • 1) 서버로의 미적용 마이그레이션들을 모두 롤백 -> 롤백된 마이그레이션 제거 -> 새로 마이그레이션 파일 생성
    • 2) 미적용 마이그레이션 하나로 합치기 -> squashmigration

댓글남기기