이번 글에서는 내가 겪었던 Django migration 이슈에 대해 정리해보려고 한다.
<목차>
1. 문제 발생
2. 원인
3. 해결 방법
클론 프로젝트를 진행하던 도중 모델링 한 테이블에 설정을 조금 변경해줘야 하는 상황이 발생하였다. 테이블에 저장되는 값 중 생년월일 항목이 있는데 이 값을 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을 만들었다.
정리하면 아래와 같다.
다시 원래대로 변경했기 때문에 python manage.py migrate 명령어를 입력하면 테이블이 업데이트 될 거라 생각했다.
그러나, 앞서 나왔던 에러가 계속 발생하는 것을 확인 할 수 있었다.
그 이후에도 다른 값을 변경하여 makemigration을 해서 수정된 migration file 4, 5... 를 만들었지만, migrate가 되지 않았다.
원인이 무엇인지 알아내기 위해 계속 이런 저런 시도를 하면서 시간을 보내던 도중 한 가지 가설이 머리를 스쳐지나갔다.
혹시 누적된 migartion file이 migrate 명령어를 입력 받았을 때 한 번에 구현되는 것이 아닌지? 그렇다면 migartion file 2에 입력된 잘못된 값이 수정이되지 않아 그 뒤의 migration file도 migrate가 되지 않는 것이 아닌지? 라는 가설이 머리에 스쳤고, migartion file 2로 접근하여 위에 사진에서 보이는 default='' 값을 지운 후 저장했다.
그 이후 python manage.py migrate 명령어를 입력하니 여태까지 만들었던 migartion file의 내용이 한꺼번에 반영되는 것을 확인 할 수 있었다.
내가 예상했던 방법이 맞았던 것이다.
이미 원인을 파악하는 단계에서 해결 방법에 대해 설명을 했지만, 한 번 더 정리하자면 아래와 같다.
잘못된 설정으로 python manage.py makemigrations 명령어를 입력하면 migartion file이 생기기는 한다. 그러나 migarte가 되지 않는다.
다시 그 잘못된 설정을 옳게 바꿔서 migartion file을 새로 만든다고 해도 그 앞에 생긴 migration file이 migrate되지 못하기 때문에 계속 에러가 발생한다. 이 경우, 아래와 같이 문제를 해결할 수 있다.
이번에 이 문제를 접하면서, 몇 가지 새로 알게된 내용이 있다. migration이 생성되더라도 migrate가 안되는 경우가 있다는 것.
그 이후에 아무리 값을 변경해서 새로운 migration file을 새로 만들더라도 앞에서 잘못 변경된 값을 잡아주지 않으면 migrate를 할수 없다는 것 이다. 이번의 문제해결의 경우는 따로 도움을 받지 않고 스스로 해결한 케이스 인데, 확실히 이런 케이스가 기억에 오래 남는 것 같다. 그래서, 앞으로도 스스로 문제를 해결하려고 하는 노력을 해야할 것 같다는 생각이 들었다. (물론, 하루 죙일 고민해도 해결이 안되는 것은 다른 사람들에게 도움을 구하는 것이 맞다고 개인적으로 생각한다.)