Django migration 이슈 [20210905]

Jungsoo kim·2021년 9월 5일
0

wecode

목록 보기
21/30

이번 글에서는 내가 겪었던 Django migration 이슈에 대해 정리해보려고 한다.

<목차>
1. 문제 발생
2. 원인
3. 해결 방법

1. 문제 발생

  클론 프로젝트를 진행하던 도중 모델링 한 테이블에 설정을 조금 변경해줘야 하는 상황이 발생하였다. 테이블에 저장되는 값 중 생년월일 항목이 있는데 이 값을 DateField라는 값을 줘서 설정을 했었다.
그런데, 실제 서비스에서는 생년월일 항목이 필수 입력사항이 아니라 비워둔 채로 데이터 베이스에 저장하는 것이 가능하게 해야 했는데 DateField 설정은 빈 값을 받을 수 없는 Type이었던 것이었다.

이를 해결하는 과정에서 DateField에 default 값을 ''으로 줘보려는 시도를 하였고, 바꾼 후에 python manage.py makemigrations 명령어를 입력하여 migration 파일을 생성하였다.

그래서 그 후에 python manage.py migrate 명령어를 입력하여 테이블을 업데이트 해주려고 했는데 오류가 발생하면서 migrate가 되지 않았다. 그래서 다시 DateField에 default값을 없앤 후 python manage.py makemigrations 명령어를 입력하여 새로운 migartion 파일을 생성하였다. 즉 최초에 migration file 1이 있었고, default = ''으로 하여 migration file 2를 만들었는데 migrate 명령어 입력시 오류가 발생하여 다시 default 값을 없애서 migration file 3을 만들었다.

정리하면 아래와 같다.

migration file 1

migartion file 2

migration file 3

  다시 원래대로 변경했기 때문에 python manage.py migrate 명령어를 입력하면 테이블이 업데이트 될 거라 생각했다.
그러나, 앞서 나왔던 에러가 계속 발생하는 것을 확인 할 수 있었다.
그 이후에도 다른 값을 변경하여 makemigration을 해서 수정된 migration file 4, 5... 를 만들었지만, migrate가 되지 않았다.

2. 원인

  원인이 무엇인지 알아내기 위해 계속 이런 저런 시도를 하면서 시간을 보내던 도중 한 가지 가설이 머리를 스쳐지나갔다.
혹시 누적된 migartion file이 migrate 명령어를 입력 받았을 때 한 번에 구현되는 것이 아닌지? 그렇다면 migartion file 2에 입력된 잘못된 값이 수정이되지 않아 그 뒤의 migration file도 migrate가 되지 않는 것이 아닌지? 라는 가설이 머리에 스쳤고, migartion file 2로 접근하여 위에 사진에서 보이는 default='' 값을 지운 후 저장했다.
그 이후 python manage.py migrate 명령어를 입력하니 여태까지 만들었던 migartion file의 내용이 한꺼번에 반영되는 것을 확인 할 수 있었다.
내가 예상했던 방법이 맞았던 것이다.

3. 해결 방법

  이미 원인을 파악하는 단계에서 해결 방법에 대해 설명을 했지만, 한 번 더 정리하자면 아래와 같다.

잘못된 설정으로 python manage.py makemigrations 명령어를 입력하면 migartion file이 생기기는 한다. 그러나 migarte가 되지 않는다.
다시 그 잘못된 설정을 옳게 바꿔서 migartion file을 새로 만든다고 해도 그 앞에 생긴 migration file이 migrate되지 못하기 때문에 계속 에러가 발생한다. 이 경우, 아래와 같이 문제를 해결할 수 있다.

  1. 잘못 설정하여 만든 migration file에 접근한다.
  2. migration file 내부에는 내가 잘못 설정한 값(default='')이 아래의 사진과 같이 나타나 있다.
  3. 잘못 설정한 것을 원래대로 돌린 후 해당 migration file을 저장해준다.
  4. 터미널에서 python manage.py migrate 명령어를 입력한다.
  5. migrate가 정상적으로 되는 것을 확인 할 수 있다.

4. 마무리

  이번에 이 문제를 접하면서, 몇 가지 새로 알게된 내용이 있다. migration이 생성되더라도 migrate가 안되는 경우가 있다는 것.
그 이후에 아무리 값을 변경해서 새로운 migration file을 새로 만들더라도 앞에서 잘못 변경된 값을 잡아주지 않으면 migrate를 할수 없다는 것 이다. 이번의 문제해결의 경우는 따로 도움을 받지 않고 스스로 해결한 케이스 인데, 확실히 이런 케이스가 기억에 오래 남는 것 같다. 그래서, 앞으로도 스스로 문제를 해결하려고 하는 노력을 해야할 것 같다는 생각이 들었다. (물론, 하루 죙일 고민해도 해결이 안되는 것은 다른 사람들에게 도움을 구하는 것이 맞다고 개인적으로 생각한다.)

profile
어렵지만 꾸준히 차근차근 해 나가자~!

0개의 댓글