실습을 진행하면서 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가지이다.
python manage.py makemigrations에는 여전히 변경사항이 없다고 나오고 그냥 python manage.py migrate해봐야 다시 원상태로 돌아가는 점위의 실습처럼 롤백을 한 뒤, 해당 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 옵션을 주어야 한다.