한창 신나게 dJango shell로 데이터를 집어넣으면서 과제 진행중이었는데
충격적이게도 마지막 AllergyDrink테이블의 drinks컬럼이 생성되지 않은 상황!
차분하게 migrations 디렉토리 내 migration 파일을 삭제하고, 다시 makemigrations
, migrate
를 진행했더니
👆🏻 자꾸 No migrations to apply라고 하는 것이 아닌가ㅠㅠ
게다가 저 위에 Add Field는 왜 자꾸 makemigrations
할 때마다 뜨는 건지...
혼자서 새벽 네시까지 생각을 해봤다.
- 내가 지시한적 없는 Add Field 작업을 하면서 AllergyDrink 테이블 관련 작업이 진행되지 않는건가?
- DB에서 직접 Drop 했는데 왜 migrate 할 때 models.py 내 테이블
Create
코드와 충돌이 나지 않는가?
아침이 되고 멘토님께 질문을 해보니 원인은 DB내에 존재하는 migrations 파일에 있었던 것!
dJango는 자체적으로 models.py 파일을 읽어서 내가 settings.py에 지정해둔 DB 내에 테이블을 생성해준다.
👆🏻 Category 테이블은 생성했지만, Menu 테이블을 참조하겠다는 FK는 생성되지 않은 상태!
하지만 이 이후로 Category를 참조하는 다른 테이블들이 생성될 때
Category 테이블이 FK로 참조할 Menu테이블과 관련된 컬럼 생성을 해야
데이터들 간의 구조가 완성이 된다
👆🏻 그래서 dJango에서 도중에 Add Field 작업을 해주는 것!
내가 코드를 입력하고 잘못 치고 그런 문제가 아닌,
dJango의 기능이다
MySQL에서 django_migrations
를 확인해보면
내가 지금까지 migrate
한 migration
파일 목록을 조회할 수 있다.
현재 보이는 건 0001_initial.py 파일!
문제는 파일명... 이었다고 해야하나 아무튼 이 파일이 문제였다!
난 계속 migrations 디렉토리 안에 있는 migration
파일을 삭제하고 다시 migrate
를 진행했었는데
이렇게 하면 매번 생기는 파일명은 모두 0001_initial.py 파일!
dJango에서 생성해준 해당파일과 이름만 일치한다면, 그 속 내용을 보지 않는다고 한다.
이말인즉슨, 내가 아무리 models.py내에서 수정을 하고 migrate를 해도
이미 DB 내 migrations
와 관련된 테이블 내에 0001_initial.py 라는 파일명이 존재하기 때문에 작업이 먹히지 않는 것!
👆🏻 멘토님이 0001_initial.py 파일 내 AllergyDrink테이블 생성 구문을 주석처리해주셨더니
DB에 존재하는 테이블과 비교해서 새로 추가된 코드라고 인식된건지
드디어! create 구문이 제대로 먹히기 시작했다.
아무래도 맨 처음에 models.py를 작성할 때 컬럼을 create하는 부분에 있어서 문제가 있었던 건지..
그 때 이후로 지우고 추가하고 볶고 암만 난리를 쳐도
이미 DB 내 migrations 테이블에 migration파일이 존재하기 때문에 추가로 migrate가 되지 않았던 것!
무섭다고 손 안댈것이 아니라, (안전한 지도하에 ^^)
migrations파일을 보는 것도 중요할 것 같다고 느낀 아침이었다...
좋은정보 감사합니다! 멘토님 부럽네요 ㅎㅎ