migration

riassuc·2021년 5월 31일

실습을 진행하면서 git때문에 파일이 꼬인적도 있었지만, 데이터베이스에 수정사항이 생겼을때 migrate가 잘 되지 않았다. python manage.py makemigrations를 해도 계속 변경사항이 없다고만 나와서 그냥 mysql에서 테이블을 삭제하고 다시 migrate해보는 등 여러가지를 하다보니 결국 뭔가 이상하게 꼬여버렸다. 그래서 정확한 방법을 알기 위해 찾아보고 아래 실습을 진행해 봤다.



최초 데이터베이스 상태


임의로 만들어본 UknownTable(unknown인데 오타)을 python manage.py makemigrations, python manage.py migrate 해서


데이터베이스에 테이블을 생성했다.


python manage.py showmigrations로 products앱의 0002번으로 uknowntable이란 파일이 생성된 것이 확인된다.


uknowntable에 임의로 값을 넣어두고


python manage.py migrate products 0001을 실행하면


mysql에서 테이블을 지우지 않았는데 최초로 migrate 했을때 처럼 uknowntable이 없어졌다.


그 상태 그대로 아무변경사항 없이 다시 python manage.py migrate를 하면


uknowntable이 다시 생기지만


그 안에 넣어둔 데이터는 없어졌다.


위의 실습에서 문제점은 2가지이다.

  • 0002 에서 0001로 롤백은 했지만, python manage.py makemigrations에는 여전히 변경사항이 없다고 나오고 그냥 python manage.py migrate해봐야 다시 원상태로 돌아가는 점
  • 최초의 migrate부터 문제가 있을경우, 0001 이전으로는 돌아갈 수 없는 점

위의 두가지 문제 해결법

위의 실습처럼 롤백을 한 뒤, 해당 migrations 파일을 지우면 된다. (위의 예에서는 products/migrations/0002_uknwontable.py 파일)
지우는 방법은 python manage.py migrate --fake products zero로 해당 앱의 마이그레이션을 모두 안한것처럼 zero로 돌린 뒤에 해당 앱 디렉토리에 migrations 디렉토리 내부에 __init__.py파일을 제외한 나머지를 다 지우면 된다.
지우고 나서 다시 변경사항에 대해서 python manage.py makemigrations로 migration 파일을 만들어서 python manage.py migrate 하면 된다.

이미 데이터베이스에 있는 테이블을 살리고 싶을때는 python manage.py migrate --fake-initial 커맨드를 사용해서 마이그레이트 할때도 --fake 옵션을 주어야 한다.


profile
riassuc

0개의 댓글