본문 바로가기

Django

django.db.utils.OperationalError: (1054, "Unknown column 'menu_id_id' in 'categories'")

처음 models.py를 만들 때 categories 테이블에 들어갈 ForeignKey의 이름을 잘못 주었다. ForeignKey는 장고가 알아서 _id를 붙여 column name을 주는데, 이름 자체에도 _id를 붙여 migrate한 바람에 column name이 menu_id_id 이렇게 만들어졌다. 그래서 일단 수정하고 그 뒤 작업을 계속했다.

이 때 잊은게, makemigration은 하고 migrate를 안 했다... runserver할 때 migrate를 하라는 경고가 떴지만 이것저것 바꾸고 있으니 조금만 있다가 하자, 하던게 쌓이고 쌓여... 오늘은 migrate를 해야겠다 생각하고 $ python manage.py migrate를 했는데 

에러

에러를 보고 예상은 했지만 어디서 문제가 났는지 보니까 menu_id_id를 menu_id로 수정한 마이그레이션 파일(products 0002)이었다. $python manage.py showmigrations를 해보니,

그 파일에서부터 migrate이 안 되어 있다. 수정하고 migrate를 하지 않고 데이터를 넣었던 게 문제겠지... mysql에서 테이블을 볼 때 column name이 menu_id로 되어있어서 migrate를 바로 할 생각을 못 했다. 그래도 한꺼번에 migrate를 할 때 변경 사항이 다 반영될 거라 생각했는데 에러로 돌아왔다.

 

이제 참고 링크를 보며 마이그레이션 파일을 초기화하고 다시 넣을 거다. DB를 보존하는 시나리오를 따를 거지만 혹시 모를 일을 대비해 백업을 해두었다. 이 때 models.py가 현재 DB와 완전히 부합해야 된다.

$ mysqldump -u root -p <DB명> > <저장할 파일명>.sql    # DB 백업

$ mysql -u root -p <새 DB명> < <불러올 파일명>.sql     # DB 복원

 

products app에 migrate 되었던 걸 전부 해제한다.

$ python manage.py migrate --fake <app명> zero

 

그리고 products app에 있는 migration 폴더 내 파일을 __init__.py만 빼고 전부 지웠다.

makemigration을 다시 해서 0001_initial 파일을 만든다.

$ python manage.py makemigrations   # initial 마이그레이션 파일을 만든다

 

그리고 나서 migrate를 할 때 그냥 하면 DB에 이미 테이블이 있으니 에러가 생긴다. --fake-initial을 붙인다.

$ python manage.py migrate --fake-initial

끝!

'Django' 카테고리의 다른 글

백엔드 서버 되어보기  (0) 2021.02.06
Django 회원가입, 로그인 엔드포인트  (0) 2021.01.30
Django CRUD - QuerySet API  (0) 2021.01.27
Django - models.py  (0) 2021.01.26
Django - mysql 설치, settings.py 설정  (0) 2021.01.25