[django] migration 리셋

EMMA·2022년 3월 14일
0

django에서 migration을 추가했다가 모든 것을 리셋해야 하는 경우...
이것저것 건들다가 다 망가진 덕에 멘토님 코멘트도 얻었고, 기록하면 좋을 것 같아 작성하는 블로그 🤣


0
what happend?

products라는 app을 만들고, models.py에서 클래스들을 작성하고 migration작업을 했다.
그러다가, 그냥 삭제하고 C.R.U.D1 과제 예시로 작업하기 위해 models.py의 내용을 수정.

그 상태에서 makemigrations > migration 했더니, 결과적으로 아래와 같은 파일이 2개 생기면서 완전 꼬여버렸다.

  • 0001_initial.py
  • 0002_category_product_alter_menu...

그래서 뒤늦게 mysql에서 처음 작성했던 테이블들을 하나씩 drop 했으나 또 잘못 지워서 데이터 추가고 뭐고 아무것도 안됨.
mysql에서 테이블 체크해보면 아래와 같이 다 뒤죽박죽 섞여 있는 상태다.
(models.py에서 users/stars 클래스를 삭제하고, menus/categories/products를 추가했는데 users/stars는 그대로 있고 새로 추가한 menus는 보이지도 않음)


그래서 그냥 여태껏 했던 migration을 다 리셋하기로 했다.

관련 내용은, 여기를 참고했음.

1
how to solve? 1

일단, migration 히스토리를 지우기로 했다.
history를 보는 방법은 다음과 같다.

python manage.py showmigrations

그럼 일단 아래와 같이 뜸.

history를 없애기 위해, 아래와 같이 입력.

python manage.py migrate --fake products(app name) zero

그러면 아래와 같이 바뀐다.

이 상태에서 그냥 products app에 있는 migration 파일을 삭제하면 된다.

2
how to solve? 2

그런데 나의 경우, 만든 데이터베이스 자체도 꼬인 상황이기 때문에
데이터베이스도 리셋해야 했다.
일단 기존에 작성되어 있는 데이터베이스는 drop 한다.

mysql> drop database taskcurd2;

그리고 다시 생성

create database taskcurd2(db name) character set utf8mb4 collate utf8mb4_general_ci;

만들었으면 migrate 진행.

python manage.py makemigrations;
python manage.py migrate;

리셋한 데이터베이스에 들어가서 내용 확인한다.

mysql> use taskcurd2 (db namd);
mysql> show tables;


멘토님 말로는, 일단 models.py 가 변경되었을 때 migrate를 계속 추가하는 것이 맞다고 한다. (git의 commit과 같은 개념)

실제 협업할 때는 다른 개발자들이 같은 migration을 공유하므로, 삭제하면 안된다. 그리고 추가 migration 파일은 이전 버전의 migration에 의존하기 때문에 조심해야.

profile
예비 개발자의 기술 블로그 | explore, explore and explore

0개의 댓글