일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 타코트론
- 서버로그
- 인천남중
- 프로그라피
- 인하멘토링
- 노트북덮개
- 인하대학교
- 신영준
- 나는리뷰어다
- 개발자회고
- 한빛미디어
- machinelearning
- 2019회고
- intell
- tacotron
- Xangle
- graphicdriver
- 봉사활동
- jaypark.dating
- CrossAngle
- 개발자를위한파이썬
- 결과를얻는법
- 쇠막대기
- 놀이동산의슈퍼컴퓨터를작동시켜라
- 프로그래머스
- 우분투비트확인
- 심플소프트웨어
- 서구동구예비군훈련장
- texttospeech
- 로그남기기
- Today
- Total
jc.jang
Django에서 migrate 명령어 에러 해결 본문
에러내용
-
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
-
1. db.sqlite3의 data를 json으로 저장
-
사용법
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라는 폴더에서 관리해야 읽어온다고한다.
python manage.py loaddata fixture [fixture...]
-
accounts/fixtures/db.json 파일을 loaddata하는 경우 다음과 같이 실행한다.
-
python manage.py loaddata accounts/fixtures/db.json
요약
-
개발 단계에서 발생한 에러라서 데이터베이스를 다 지우고 다시만들어도 무방했다.
-
하지만 '버그야 잘만났다.'하고 현실이라고 생각하고 해결했다.
-
덕분에 dumpdata랑 loaddata등을 알게 되었다.