jc.jang

Django에서 migrate 명령어 에러 해결 본문

Django/Django - etc

Django에서 migrate 명령어 에러 해결

jangstory 2019. 10. 7. 00:16

에러내용

  • user model을 변경한 후 migreate 명령어를 실행하면 에러가 발생한다.

원인 및 해결 방법

  • 커스텀 유저 모델을 구현하기 위해 AbstractUser 모델을 상속받고 settings.AUTH_USER_MODEL을 지정했다.

  • 하지만 이 방법은 프로젝트 시작 전에 migrate를 해야한다. 기본 migrate의 경우 auth_user로 생성되지만 accounts앱의 user는 accounts_user로 테이블 명이 달라진다.

  • initial migrate를 하고 settings.AUTH_USER_MODEL을 변경하면 에러가 발생함.

  • 이 AbstractUser 모델을 상속 받고 개발하다가 재정의 할 필요가 없어서 되돌아 가고 싶었다.

  • 하지만 지금은 이유를 알 수 없는 에러가 발생했다.

 

  • makemigrations을 통해 모델의 변경 내역을 살펴 보면 기존에 존재하는 테이블을 다시 생성하거나 지우는 등의 의도치 않은 작업이 실행된다.

  • 그래서 구글에 검색한 결과 아래와 같이 해결책이 나왔다.

  • 1. migrations 폴더에서 '__init__.py' 파일을 제외한 모든 파일 삭제

  • 2. settings.py 및 models.py 파일 수정

  • 3. 마이그레이션 및 migrate 명령 실행

  • 똑같이 따라했는데 안됐다. 그 이유는 db.sqlite3에 이미 테이블이 존재한다는 이유다. 아무래도 제대로 꼬인 것 같다.

 

  • 그래서 지인에게 물어봤더니 dumpdata라는 명령어를 활용하라고 했다.

  • 이렇게 해결하면 될 것 같다.

  • 1. db.sqlite3의 data를 json으로 저장

  • 2. db.sqlite3와 migrations 폴더에서 __init__.py 파일을 제외한 모든 파일 삭제

  • 3. 마이그레이션 및 migrate 명령 실행

  • 4. json data를 새롭게 생성된 db.sqlite3에 load

 

python manage.py dumpdata [app_label[.ModelName] [app_label[.ModelName] ...]]
  • 이 명령어를 통해 필요한 테이블을 json으로 저장한다.

  • accounts앱의 모든 모델의 레코드를 accounts_db.json이라는 파일로 저장하고 싶으면

  • `python manage.py dumpdata accounts > accounts_db.json`라고 명령어를 입력한다.

  • 또한 accounts 앱 외에 기본 모델을 복사하기 위해

  • `python manage.py dumpdata --exclude=accounts > db.json`라고 명령어를 입력한다.

 

  • 2. db.sqlite3와 migrations 폴더에서 __init__.py 파일을 제외한 모든 파일 삭제

  • 반드시 db.sqlite3와 migrations에 있는 파일을 백업해 놓아야한다.

 

  • 3. 마이그레이션 및 migrate 명령 실행

python manage.py migrate
  • 마이그레이트 실행

 

  • 4. json data를 새롭게 생성된 db.sqlite3에 load

  • fixtures라는걸 처음 알게 됐는데 데이터베이스 내용을 포함하는 파일은 fixtures라는 폴더에서 관리해야 읽어온다고한다.

  • django-admin/fixture(링크)

python manage.py loaddata fixture [fixture...]
  • accounts/fixtures/db.json 파일을 loaddata하는 경우 다음과 같이 실행한다.

  • python manage.py loaddata accounts/fixtures/db.json

요약

  • 개발 단계에서 발생한 에러라서 데이터베이스를 다 지우고 다시만들어도 무방했다.

  • 하지만 '버그야 잘만났다.'하고 현실이라고 생각하고 해결했다.

  • 덕분에 dumpdata랑 loaddata등을 알게 되었다.

참고

Comments