docker로 배포를 돌리니 InconsistantMigrationHistory 오류가 났다.
로컬에서는 잘 돌아가는데 뭐가 문제인가...
알고보니 이전에 만들었던 docker volume이 문제였다. 내가 accounts관련을 나중에 만들어서, docker에는 accounts에 의존하지만 미리 생성된 volume이 존재하기 때문에 post가 먼저 migrations되는 것이였다.
로컬에서 migrations오류 날 때 db를 삭제하는 것처럼
docker에서 계속 문제가 생기면 일단 volumes를 삭제해보자.
docker-compose down -v
migrations오류
로컬에서도 굉장히 자주나는 오류!
일단 이 오류가 발생하면 migrations와 db를 삭제해주자.
1. settings.py의 INSTALLED_APPS에서 의존성대로 앱이 작성되어있는지 확인하자.
예를 들어 post는 accounts앱의 모델에 의존하고 있는데, 이를 반대로 입력하면 안된다.
2. user와 관련된 모델을 migrations할 때는 admin관련된 것은 주석처리하고 실행한다.
admin이 먼저 실행되면 안되기 때문에...주석처리를 안하면 오류가 날 수 있다.
user관련해서 모두 완료했다면 주석 처리를 풀고 다시 migrations + migrate 해주자.
# settings.py
INSTALLED_APPS = [
'django.contrib.admin',
#~~
]
# urls.py
#from django.contrib import admin
from django.urls import path, include
urlpatterns = [
#path('admin/', admin.site.urls),
path('posts/', include('post.urls')),
path('accounts/', include('accounts.urls')),
]
이것을 완료했다면 migrations에서 크게 오류가 날 건 없다.
또, python manage.py showmigrations 명령어로 migrations history를 볼 수 있다.
사실 migrations폴더를 전체 지우는 것보다는 __init__.py모듈빼고 다 지우라는 얘기도 많다.(아직은 차이를 모르겠음)
find . -path "*/migrations/*.py" -not -name "__init__.py" -delete
find . -path "*/migrations/*.pyc" -delete
위 명령어를 통해 간단하고 빠르게 지워주자(외우자)
또, migrations파일을 하나하나 지우면 migrate를 할 때 앱을 직접 명시해서 해줘야 하는 불편함이 있다(근데 의존성때문에 이게 좋다고는 하던데..?)
명령어로 한 번에 하면 안그래도 됨.
이번에 migrations를 하면서 깨달은 건데 .gitignore에는 migrations가 없다. 즉, 파일이 github에 올라간다!!
왤까?
나는 migrations가 다른사람들과 충돌이 일어날 수도 있다고 생각해서 무조건 있을 줄 알았는데...
궁금해서 검색해보니까 디비 스키마를 복구하기 위해 그렇다고 한다.
django migration 파일은 커밋되어야 할까
이미 커밋된 마이그레이션 파일은 지우면 안 됩니다. 당신이 master 브랜치를 리셋하고 force push하지 않듯이요.
velog.io
여기에서 더 자세한 의견을 들을 수 있다.
'django > 오류' 카테고리의 다른 글
[Django] error: getaddrinfo eai_again (0) | 2024.01.12 |
---|---|
[Docker] Docker에서 Mysql 한글 설정하기 (1) | 2023.10.06 |
[docker] django.db.utils.OperationalError: (1051, Unknown table ~) (0) | 2023.06.01 |
Network '~~' not found (0) | 2023.05.24 |
django.db.utils.OperationalError: (1050, "Table 'django_admin_log' already exists") (0) | 2023.05.23 |