2017-09-14 5 views
0

내 프로덕션 서버에서 실수로 내 응용 프로그램 중 하나에서 마이그레이션 디렉토리를 삭제했습니다. 여러 사람이 응용 프로그램에서 작업하기 때문에 응용 프로그램을 만들 때 로컬에서 마이그레이션하지 않고 모델 변경을 추진하고 프로덕션 서버에서 마이그레이션을 수행 한 다음 마이그레이션을 수행했습니다. 이전에 마이그레이션 문제가 있었기 때문에이 작업을 수행했으며 이것이 좋은 해결책 일 수 있다고 생각했습니다. 마이그레이션 폴더의 로컬 복사본이 없기 때문에 나는 영원히 사라질 것을 두려워합니다. 내 질문은 이것이다. Webfaction에서 phpPgAdmin에 액세스 할 수 있으며 데이터베이스에는 django_migrations 테이블이 있습니다. 한 가지 해결책은 최신 마이그레이션을 찾고, 예를 들어 0009_migration.py라고 말하면서, 향후 해당 응용 프로그램에서 모델을 변경하면 새로운 마이그레이션 파일 인 0010_migration.py의 이름을 바꾸는 것보다 간단합니다. 그렇게하면 간단하게 마이그레이션을 실행할 수 있으며, 마이그레이션이 아직 실행되지 않은 경우에만 0010_migration.py로 간주됩니다. 그러나 호기심에서 벗어나 PostgreSQL 데이터베이스를 살펴보고 django_migrations 테이블의 파일에있는 이전 기록에서 앱 마이그레이션 디렉토리에 이전 파일을 만듭니다.삭제 된 장고 마이그레이션 복구

나는 이것이 물어 간단한 방법 생각 "이 migrations.py 파일로 엔지니어 django_migrations 테이블 행을 반전 할 수있는 방법이 있나요을?"여기 django_migration 테이블 내가 PostgreSQL을에있는 행과 제가의 이미지입니다 파일을 다른 명령으로 보길 원할 것입니다.

장고 마이그레이션

class Migration(migrations.Migration): 

    dependencies = [ 
     ('portfolio', '0001_initial'), 
    ] 

    operations = [ 
     migrations.AddField(
      model_name='project', 
      name='contact_form', 
      field=models.BooleanField(default=False), 
     ), 
    ] 

PostgreSQL의 django_migrations 테이블 행 enter image description here

+0

진지하게, 미래에 이것을하지 마십시오. 마이그레이션은 코드 기반의 일부이며 버전 제어가 필요합니다. –

+0

나는 다니엘, 우리의 어두운 과거의 일부분에 동의하며, 우리는 모두 실수에서 배웠으며,이 경우에도 여전히 그 모습을보고있다. – JBT

답변

2

1) 마이그레이션 파일이 삭제 된 것을 하나의 응용 프로그램에 대한 모든 entires 데이터베이스의 마이그레이션 테이블에서 삭제합니다.

2) $ python manage.py makemigrations <app>

1 새로운 마이그레이션 파일 (AN inital 마이그레이션)을 생성한다.

3) $ python manage.py migrate <app> --fake

마이그레이션 테이블에 초기 마이그레이션을 기록하지만, 다른 테이블 (실제로 마이그레이션하지 않습니다)에 접촉하지 않습니다.

마이그레이션 파일이 삭제 된 앱에 변경 사항이없는 한 계속 작동해야합니다.

이것은 마이그레이션 파일이 실수로 삭제 된 문제를 해결할 수 있습니다 (자동으로 만들어진 파일이 manage.py이고 조작되지 않았다고 가정). 그러나 리팩터링 할 수 있는지 또는 리팩토링 테이블을 리팩터링 할 것을 권장하는지는 알지 못합니다. 또한 마이 그 레이션 파일의 자동 생성이나 자동 생성 이후의 마이 그 레이션 파일의 수동 조작이 필요합니다 또는 심지어 장고 백엔드를 무시해야합니다.

편집 주석의 추가 질문에 대한 대답

:

  • 초기 $ python manage.py makemigrations <app> 지정된 응용 프로그램에서 모든 모델의 현재 스키마를 설명하는 마이그레이션 파일 ($ python manage.py makemigrations을 생성 찾는 것을 수행 모든 앱).
  • 초기 $ python manage.py migrate <app>
  • 는 데이터베이스에 주어진 응용 프로그램의 모든 마이그레이션 파일을 적용하고 마이그레이션 파일이 적용되었다 마이그레이션 테이블 에 기록합니다. 초기 마이그레이션에서 필요한 속성 및 관계가있는 필요한 모든 데이터베이스 테이블이 생성됩니다 ($ python manage.py migrate 모든 응용 프로그램에 대해 해당 작업이 수행됩니다).
  • 이 응용 프로그램의 lates을 마이그레이션 파일 (그래서이 응용 프로그램의 모델의 스키마의 최신 설명) 사이의 차이 및 모델의 현재 스키마를 설명 마이그레이션 파일을 생성합니다 $ python manage.py makemigrations <app>에 따라.
  • 데이터베이스의 이전 테이블은 에 관한 정보를 보유하고 있으며 개의 이전 파일이 개의 응용 프로그램이 데이터베이스에 적용되었습니다.
  • 다음 $ python manage.py migrate <app>은 해당 마이그레이션 테이블을 사용하여 데이터베이스에 이미 적용된 마이그레이션 파일을 확인합니다. 적용되지 않은 마이그레이션 파일이있는 경우 해당 파일이 적용된 다음 마이그레이션 테이블에 기록됩니다.

그래서 당신은 응용 프로그램의 마이그레이션 파일을 삭제하면 당신은 단지 설명 및 그 응용 프로그램의 모델의 스키마 역사을 삭제합니다. 마이그레이션 테이블의 항목에 대해서도 마찬가지입니다. 에 대한 정보를 삭제하면 마이그레이션 파일이 데이터베이스에 적용됩니다.

  • $ manage.py migrate <app> --fake 또한 파일이 데이터베이스에 적용해야하고 모든 마이그레이션 테이블로 마이그레이션 파일-에이 --적용 할 기록하는 마이그레이션 확인합니다. 그러나이 명령 을 데이터베이스에 적용하지 않습니다.

그래서 내가 제안 실제 솔루션이하는 것은 다음

    마이그레이션 파일이
  1. 그 하나 하나 개의 새로운 마이그레이션 파일을 생성 한 특정 앱 데이터베이스에 적용 된 대한
  2. 삭제 정보 app
  3. 마이그레이션 파일을 마이그레이션 테이블에 기록하되 적용하지 마십시오. < <이 때문에 마이그레이션 파일이 삭제 된 이후 앱의 모델에 변경 사항이 없어야합니다.

왜 마이그레이션 테이블에서 기존 항목을 삭제해야합니까? 당신이 당신의 질문에 제공된 이미지에서 볼 수 있듯이

는 마이그레이션 저장소의 항목은 이름 어떤의 마이그레이션 파일을 적용했다. 이러한 항목을 삭제하지 않으면 같은 이름 (또는 숫자 -이 사실을 100 % 인식하지 못함)이있는 마이그레이션 파일이 이미 적용되었다고 가정하고 manage.py migrate이 적용됩니다. 따라서 마이그레이션을 건너 뛰었을 것입니다.

+0

감사합니다. Max는 django_migrations 행을 정확하게 삭제할 때 내 기존 데이터 또는 앱의 모델 스키마에 영향을주지 않습니까? – JBT

+0

간단한 대답은 * 예 *입니다. 내 답변에 자세히 설명하겠습니다. –