장고(Django) - 마이그레이션(Migration)
마이그레이션(Migration)이란?
장고 공식 문서에서는 마이그레이션이 모델의 변경 내역을 DB *스키마에 적용시키는 장고의 방법이라고 설명하고 있습니다.
장고는 ORM을 사용하기 때문에 models.py와 클래스를 통해 DB 스키마를 생성하고 컨트롤 하게 되는데, 이 때 DB 스키마를 git처럼 버전으로 나눠서 관리 할 수 있게 해 주는 시스템이라 생각하시면 됩니다.
즉 하나의 마이그레이션 파일은 해당 마이그레이션이 생성된 시점의 모델의 구조(DB의 스키마)를 담고 있습니다.
*스키마(Schema)란? : DB 내에서 데이터가 저장되는 구조와 제약 조건을 정의한 것. 장고로 치면 하나의 어플리케이션의 models.py 파일이라고 할 수 있습니다.
migration 관련 명령어
1. python manage.py makemigrations [app_name]
- 마이그레이션을 생성하는 명령어입니다.
뒤에 app_name을 입력하면 해당 app에 대해서만 마이그레이션을 생성하고 app_name을 생략하면 전체 app에 대해서 마이그레이션을 생성합니다.
app_name을 입력하지 않으면 의도하지 않은 마이그레이션이 생성될 수 있으니 가급적 app_name을 같이 입력하는 것을 권장드립니다.
(단, 프로젝트 생성 후 처음 하는 migrate 작업을 위한 마이그레이션을 생성할 때는 app_name을 생략하셔야 합니다.)
예시로 간단한 게시판 모델을 만들어 보았습니다.
Post라는 이름의 클래스(테이블)이 있으며 해당 클래스는 title과 body라는 필드를 가집니다.
makemigrations를 실행하자 변경사항이 마이그레이션 파일로 생성되었습니다.
2. python manage.py migrate [app_name] [migration_name]
- 마이그레이션을 적용하는 명령어입니다. 즉 실제 DB에 변경사항을 적용하는 명령어라고 생각하시면 됩니다.
makemigrations와 같이 app_name을 지정해서 특정 app만 migrate 할 수 있으며 app_name 뒤에 마이그레이션 파일의 이름을 지정하면 해당 번호(버전)의 마이그레이션을 적용하게 됩니다. 즉 이전 버전으로 되돌리는 것도 가능합니다.
예시로 한번 살펴봅시다.
아까 생성한 마이그레이션 파일을 migrate 하였습니다.
그 후 서버를 실행시키고 admin 페이지에 가보면 정상적으로 테이블이 생성된 것을 확인할 수 있습니다.
3. python manage.py showmigrations [app_name]
- 프로젝트의 마이그레이션에 대해 적용 여부를 한 눈에 보여줍니다.
app_name을 지정하면 해당 앱에 대해서만, 생략시 전체 앱에 대해 보여주게 됩니다.
X표시로 체크된 것이 적용된 마이그레이션을 의미합니다.
4. python manage.py sqlmigrate app_name migration_name
- 해당 마이그레이션 파일이 어떤 SQL 구문으로 실행되는지 보여줍니다. 실제로 마이그레이션을 실행하지는 않습니다.
보통 디버깅용이나 어떤 구문이 들어가는지 확인해야 할 때 사용합니다.
아까 Post모델의 첫 마이그레이션 파일을 확인해보면 다음과 같은 SQL구문이 나옵니다.
주의점
적용된 마이그레이션 파일은 절대로 삭제하시면 안됩니다. 각 마이그레이션은 이전 버전에 대해 의존성을 가지기 때문에 DB 전체가 돌아올 수 없는 강을 건널 수도 있습니다.
마이그레이션 파일을 삭제하시려면 반드시 적용을 해제하고 삭제하셔야 합니다.
예를 들어
0001_initial
0002_auto_....
이렇게 두 개의 마이그레이션 파일이 있고 0002가 migrate 된 상황이라고 가정합시다.
이 때 0002 마이그레이션 파일을 삭제하고 싶다면
1. python manage.py migrate app_name 0001 명령어로 이전 버전으로 적용시킨후 삭제
2. python manage.py migrate app_name zero 명령어로 마이그레이션을 초기화 시킨 수 삭제
둘 중 하나의 절차를 거친 후 삭제하서야 합니다.
물론 DB 전체를 날려도 되는 상황이라면 그냥 마이그레이션 파일을 다 날려버리고 DB파일도 날려버리면 되지만 그게 아니라면.. 반드시 위의 절차를 준수하여 주시기 바랍니다.