Django 1.8 : 기존 스키마에 대한 초기 마이그레이션 만들기
마이그레이션 시스템을 사용하는 django 1.8 프로젝트를 시작했습니다.
어떻게 든 지저분 해져서 DB에서 마이그레이션 폴더와 테이블을 지우고 이제는 성공하지 못한 채 재구성하려고합니다.
3 개의 앱 (3 개의 models.py
파일)이 있으며 모델은 표를 정확히 반영합니다!
지금까지 찾은 최선의 접근 방식은 다음과 같습니다.
- 모든
migrations
폴더를 지 웁니다 . 끝난! django_migrations
테이블 에서 모든 것을 삭제 하십시오. 끝난!python manage.py makemigrations --empty <app>
모든 앱에 대해 실행하십시오 . 끝난!- 을 실행
python manage.py migrate --fake
합니다. 끝난! (모든makemigrations
명령 후에 실행하는 경우에만 작동하지만 .
이제 새 필드를 추가하고 makemigrations
명령을 실행 하면 다음 오류가 발생합니다.
django.db.utils.OperationalError: (1054, "Unknown column 'accounts_plan.max_item_size' in 'field list'")
나는이 일에 HOURS를 태워왔다. 매번 마이그레이션 중단없이 계속 작업 할 수 있도록 마이그레이션을 어떻게 초기화 할 수 있습니까?
왜 그렇게 복잡합니까? 간단한 한 줄짜리가없는 이유 : initiate_migrations_from_schema
?
편집 :
이제 상황이 더 나빠집니다. 나는 django_migrations
테이블을 자르고 모든 migrations
폴더를 삭제했습니다 .
이제 실행하려고합니다 python manage.py migrate --fake-initial
(DEV 문서에서 찾은 것), Django의 모든 '내부'앱 (인증, 세션 등)을 설정하고 다음을 얻습니다
(1054, "Unknown column 'name' in 'django_content_type'")
..
이제이 "열"은 실제 열이 아닙니다. 그것은이있어 @property
장고에 정의 된 contenttypes
응용 프로그램. 여기서 무슨 일이 일어나고 있습니까? name
부동산을 실제 열로 식별하는 이유는 무엇 입니까?
마침내 작동하게되었지만 이유는 모르겠지만 앞으로 작동하기를 바랍니다.
수많은 시도를하고 Django의 개발 사이트 ( link ) 를 살펴본 후 .
단계는 다음과 같습니다 (이 문제에 직면 한 사람을위한) :
django_migrations
테이블 비우기 :delete from django_migrations;
- 모든 앱에 대해 해당
migrations
폴더를 삭제 합니다.rm -rf <app>/migrations/
- "기본 제공"앱에 대한 마이그레이션을 재설정합니다.
python manage.py migrate --fake
- 각 앱 실행 :
python manage.py makemigrations <app>
. 종속성을 관리하십시오 (ForeignKey가있는 모델은 상위 모델 이후에 실행되어야 함). - 드디어:
python manage.py migrate --fake-initial
그 후 --fake-initial
플래그 없이 마지막 명령을 실행했습니다 .
이제 모든 것이 작동하고 마이그레이션 시스템을 정상적으로 사용할 수 있습니다.
나는이 문제를 겪는 유일한 사람이 아니라고 확신합니다. 더 잘 문서화되고 단순화되어야합니다.
Django 1.9 사용자를위한 업데이트 :
Django 1.9.4에서이 시나리오가 다시 발생했는데 5 단계가 실패했습니다.
모든 나는 대체됩니다해야 할 일을했을 --fake-initial
와 --fake
그것을 작동하게 할 수 있습니다.
이 시나리오에 부딪 혔지만 문제를 해결하기 위해 데이터베이스를 삭제할 필요가 없었습니다. 일반적으로 앱에서 마이그레이션 폴더를 삭제하고 데이터베이스에서 마이그레이션 항목을 제거합니다.
한 번에 하나의 앱 마이그레이션을 실행하려고합니다. 앱이 다른 테이블에 의존하는 경우 분명히 마지막에 추가하십시오.
또한 일반적으로 실행하면 python manage.py makemigrations 다음 python manage.py migrate 초기 마이그레이션에서도 Django 1.7 및 1.8에서 잘 작동합니다.
장고 ..., 1.8, 1.9, ...
달성하려는 것은 기존 마이그레이션을 스쿼시하고이를 대체하는 것입니다.
릴리스 할 때 명령을 사용하지 않고 올바르게 수행하는 방법 (데이터베이스 및 동료에 영향을주지 않는 경우).
모든 앱에 대해 마이그레이션 폴더를 제거하십시오.
mv <app>/migrations/ <app>/migrationsOLD/
각 앱 실행 :
python manage.py makemigrations <app>
.각각의 새 마이그레이션을 사용자 지정합니다.
당신이 경우 복잡한 응용 프로그램 , 또는 더 많은 애플 리케이션과 그들 사이의 관련 모델을 피하기 위해
CircularDependencyError
또는ValueError: Unhandled pending operations for models
:두 번째 빈 마이그레이션을 준비합니다
<app>
0002_initial2.py
(app_other::0001_initial.py
및<app>
::에 대한 종속성도 넣습니다0001_initial.py
-다른 앱의 0001 마이그레이션 단계에서 생성 된 모델과 관련된 모든 ForeignKey, M2M).모든 것이 순서대로 이루어져야합니다. 때로는 준비를 위해 더 많은 마이그레이션이 필요할 수 있습니다.
dependencies
각 마이그레이션에서 여기 속성을 관리 하십시오.초기 값 관리- 필요한 경우 모든
RunPython
작업을 확인migrationsOLD
하고 코드를 새 초기 마이그레이션에 복사합니다.(에 대한 선택 사항
--fake-initial
)initial=True
모든 새 마이그레이션 클래스에 추가합니다 (추가 된 경우 0002도 해당).replaces
새 마이그레이션 클래스에 속성을 추가 합니다. (자신의 관습 a처럼squashmigrations
). 모든 이전 마이그레이션을<app>
로 모든 것을 확인합니다
makemigrations
."감지 된 변경 사항 없음"주장
migrate -l
모든 곳에 [x] 표시 여부 확인비슷한 주장 :
[X] 0001_initial
[X] 0002_initial2 (102 개의 스쿼시 마이그레이션)
예:
오래된 경우 :
0001_initial.py
0002_auto.py
...
0103_auto.py
준비 :
0001_initial.py
0002_initial2.py (optional but sometimes required to satisfy dependency)
replaces
마지막 항목에 추가합니다 (여기서는 0002, 0001 일 수 있음).
replaces = [(b'<app>', '0002_auto.py'), ..., (b'<app>', '0103_auto.py')]
0001_initial.py는 이전 이름과 같은 방식으로 이름을 지정해야합니다.
0002_initial2.py는 새로운 것이지만 이전 마이그레이션을 대체하므로 Django는로드 된 것으로 처리합니다.
If you are using routers, might be a problem there. Check method allow_migrate
if it is executed in a right way in routers.py
. Try to set return value always to be True
, and check whether it resolves problem,
def allow_migrate(self, db, app_label, model_name=None, **hints):
return True
Thanks - I've been working on this problem for a while and your best practices list was really handy. This may potentially help newbies to python like me:
If you're starting with an existing set of models, clear any previous migrations you have made!
My situation was I started with sqlite just to understand django and then switched to a mysql db - and it kept throwing 1053 error, probably trying to apply a previous migration it didn't have the resources to resolve...
'Development Tip' 카테고리의 다른 글
UITableView 스크롤 위치를 가져 와서 저장할 수 있습니까? (0) | 2020.10.31 |
---|---|
React.js — 속성 객체를 자식 컴포넌트에 전달하는 방법은 무엇입니까? (0) | 2020.10.31 |
웹 작업자가 할 수없는 서비스 작업자는 무엇을 할 수 있습니까? (0) | 2020.10.31 |
DateTime 개체에서만 날짜 또는 시간 가져 오기 (0) | 2020.10.31 |
ASP.Net MVC에서 전역 필터를 선택적으로 비활성화하는 방법 (0) | 2020.10.31 |