8.마이그레이션을 통한 DB스키마 관리
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
댓글남기기