Django

장고(Django) - 마이그레이션(Migration)

티베트 모래여우 2020. 11. 12. 23:58
반응형

마이그레이션(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라는 필드를 가집니다.

python manage.py makemigrations 명령어 실행

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파일도 날려버리면 되지만 그게 아니라면.. 반드시 위의 절차를 준수하여 주시기 바랍니다.

저도 처음 장고배울때 마이그레이션 때문에 엄청 고생했었습니다.

반응형