Django 1.7-변경 사항을 감지하지 못하는 마이그레이션


140

제목에서 알 수 있듯이 마이그레이션이 작동하지 않는 것 같습니다.

응용 프로그램은 원래 1.6 미만이므로 마이그레이션이 처음에는 존재하지 않으며 실제로 실행 python manage.py migrate하면 다음과 같은 결과가 나타납니다.

Operations to perform:
  Synchronize unmigrated apps: myapp
  Apply all migrations: admin, contenttypes, auth, sessions
Synchronizing apps without migrations:
  Creating tables...
  Installing custom SQL...
  Installing indexes...
Running migrations:
  No migrations to apply.

에서 모델을 변경해 myapp도 예상대로 마이그레이션되지 않은 것으로 표시됩니다.

그러나 python manage.py makemigrations myapp내가 달리면 :

No changes detected in app 'myapp'

명령을 실행하는 방법과 방법에 상관없이 앱이 변경 사항을 감지하지 못하거나 마이그레이션 파일을 앱에 추가하지도 않습니다.

앱을 마이그레이션에 강제로 적용하고 본질적으로 "이것이 내 작업의 기반"이라고 말하거나 다른 방법을 말하는 방법이 있습니까? 아니면 뭔가 빠졌습니까?

내 데이터베이스는 PostgreSQL 데이터베이스이므로 전혀 도움이되지 않습니다.


제공된 솔루션이 저에게 효과가 없으므로 동일한 문제에 직면 한 경우 여기에 내 솔루션이 있습니다! 1. 모든 앱에서 마이그레이션 파일을 삭제합니다. 2. 데이터베이스를 삭제하고 다시 만듭니다. 3. makemigrations를 실행하고 명령을 마이그레이션합니다. PS 1 단계와 3 단계를 먼저 시도합니다. 여전히 오류가 있으면 1-3 단계를 수행하십시오.
Amoroso 2018 년

답변:


187

django 1.6에서 만든 기존 앱에서 변경하는 경우 설명서에 나열된 하나의 사전 단계를 수행해야합니다.

python manage.py makemigrations your_app_label

설명서에서 가장 먼저 할 일은 python manage.py makemigrations실패 할 것이기 때문에 설명서에 앱 레이블을 명령에 추가해야한다는 것이 명확하지 않습니다 . 초기 마이그레이션은 버전 1.7에서 앱을 만들 때 수행되지만 1.6에서 온 경우에는 수행되지 않았습니다. 자세한 내용은 설명서의 '앱에 마이그레이션 추가' 를 참조하십시오.


1
Django 1.6에서 온 사람들에게 좋은 답변입니다! 감사!
David D.

1
하나 이상의 앱이있는 경우 어떻게합니까? python manage.py makemigrations APP_LABEL각각에 대해 해야합니까 ?
Alston

1
Django 1.9에서 여기와 내 앱은으로 만들어 ./manage.py startapp졌지만 여전히 레이블을 명시 적으로 언급해야했습니다
maxbellec

50

다음과 같은 이유로 발생할 수 있습니다.

  1. INSTALLED_APPS목록에 앱을 추가하지 않았습니다 settings.py ( 사용중인 django 버전에 따라 app 폴더의 apps.py에서 appConfig의 서브 클래스에 앱 이름 또는 점으로 구분 된 경로 를 추가해야 함 ). INSTALLED_APPS 설명서를 참조하십시오
  2. migrations해당 앱 안에 폴더 가 없습니다 . (해결 방법 : 해당 폴더를 작성하십시오).
  3. 해당 앱의 폴더 __init__.py안에 파일 이 없습니다 migrations. (해결 방법 : 이름이 __init__.py 인 빈 파일을 만드십시오 )
  4. __init__.py앱 폴더 안에 파일 이 없습니다 . (해결 방법 : 이름이 __init__.py 인 빈 파일을 만드십시오 )
  5. models.py앱에 파일 이 없습니다
  6. 파이썬 클래스 (모델로 가정)는 models.py상속받지 않습니다.django.db.models.Model
  7. 모델 정의에서 의미 상 실수가 있습니다. models.py

참고 : 일반적인 실수는 파일 에 migrations폴더 를 추가하는 것입니다 .gitignore. 원격 저장소에서 복제하면 migrations폴더 및 / 또는 __init__.py파일이 로컬 저장소에 없습니다. 이로 인해 문제가 발생합니다.

나는에 다음 라인을 추가하여 마이그레이션 파일을 gitignore하는 것이 좋습니다 .gitignore파일을

*/migrations/*
!*/migrations/__init__.py

1
프로젝트를 복제하고 마이그레이션 폴더가 리포지토리로 푸시되지 않았으므로 마이그레이션 디렉터를 추가해야했고 init .py를 추가하고 마이그레이션을 수행 할 수있었습니다. 감사합니다
Junaid

/ migrations 폴더의 내용을 삭제하여 아직 배포하지 않은 프로젝트의 항목을 "재설정"했습니다. __init__.py마이그레이션과 함께 폴더를 실수로 삭제했습니다 .
세스

이것은 나를 위해 그것을 .... You don't have __init__.py file inside migrations folder of those apps. (Solution: Just create an empty file with name __init__.py).. 그리고 파일을 추가하여 발생했습니다.gitignore
lukik

1
마이그레이션 폴더에서 init .py 파일이 중요한 이유는 무엇 입니까? 이 논리를 어디에서 더 깊이 파헤칠 수 있습니까?
Nimish Bansal

1
@NimishBansal python 3.3 __init__.py파일은 파이썬 패키지로 취급하기 위해 디렉토리 안에 필요합니다. 이것을보십시오
Mohammed Shareef C

29

좋아, 분명한 단계를 놓친 것처럼 보이지만 다른 사람이 동일한 경우를 대비하여 게시하십시오.

1.7로 업그레이드 할 때 내 모델이 관리되지 않게되었습니다 ( managed = False) True. 이전 과 같이 모델이 있지만 되 돌린 것 같습니다.

해당 줄을 제거하고 (기본값은 True로 설정) makemigrations즉시 실행 하면 마이그레이션 모듈이 만들어져 작동합니다. makemigrations관리되지 않는 테이블에서 작동하지 않습니다 (후시에는 분명합니다)


4
"managed = False"를 어디에서 변경 / 추가 했습니까? 같은 문제가 있습니다
Ycon

1
더 이상 해당 코드가 없지만 올바르게 기억하면 클래스의 속성으로 생각합니다.
TyrantWave

1
좋은 지적. manage.py inspectdbmanage = False 를 추가합니다. 레거시 데이터베이스를 가져 오는 경우 신중하게 조정해야합니다!
Alessandro Dentella

@ TyrantWave, 당신은 내 하루를 저장했습니다. 고마워
Utkarsh Sharma 11

당신 app_label이 같은지 확인하십시오
Luv33preet

19

내 솔루션은 여기에서 다루지 않았으므로 게시하고 있습니다. 내가 사용하고있었습니다 syncdb- 단지 프로젝트 그것을 얻기 위해에 대한 실행. 그런 다음 Django 마이그레이션을 사용하려고 시도했을 때 처음에는 가짜 였고 'OK'라고 말했지만 데이터베이스에는 아무런 변화가 없었습니다.

내 솔루션은 내 응용 프로그램에 대한 모든 마이그레이션 파일을 삭제하는 것이 었습니다 뿐만 아니라 로의 응용 프로그램 마이그레이션에 대한 데이터베이스 레코드 django_migrations테이블.

그런 다음 방금 초기 마이그레이션을 수행했습니다.

./manage.py makemigrations my_app

뒤에 :

./manage.py migrate my_app

이제 문제없이 마이그레이션을 수행 할 수 있습니다.


참고로 여기에 "파일과 데이터베이스 레코드" 라고 말하는 것이 중요 합니다. 데이터베이스 레코드를 제거하지만 파일은 제거하지 않으면 (이를 제외하고는 __init.py__작동하지 않습니다.)
Mike Robinson

15

@furins에 동의하십시오. 모든 것이 순서대로 보이지만이 문제가 발생하면 Model 클래스에 추가하려는 속성과 제목이 같은 속성 메소드가 있는지 확인하십시오.

  1. 추가하려는 속성과 이름이 비슷한 메소드를 제거하십시오.
  2. manage.py makemigrations my_app
  3. manage.py 마이그레이션 my_app
  4. 메소드를 다시 추가하십시오.

11

이것은 어리석은 실수이지만 모델 클래스의 필드 선언 줄 끝에 추가 쉼표가 있으면 해당 줄이 적용되지 않습니다.

데프를 복사하여 붙여 넣을 때 발생합니다. 자체적으로 배열로 정의 된 마이그레이션에서

어쩌면 이것은 누군가를 도울 것입니다 :-)


1
귀하의 의견은 내 문제를 찾는 데 도움이되었습니다. 선택 목록에서 마지막 선택의 끝에 쉼표가 없었습니다.. 명백히 장고는 매우 감동적입니다.
Maxim

1
@Maxim : 문제의 원인은 아닐 것입니다. 끝에 쉼표가없는 목록은 여전히 ​​목록입니다. 또 다른 문제는 튜플입니다. 튜플에 하나의 요소 만 있으면 쉼표가 필요합니다.
blueFast

많은 시간을 절약 한 친구! @ dangonfast : 모델 정의에서 실제로 문제입니다.
MrE

11

어쩌면 너무 늦었지만 migrations앱에 __init__.py파일 이있는 폴더 를 만들려고 했 습니까?


1
이 "makemigrations"가 있으면 앱에 대한 마이그레이션이 생성됩니다. 그렇지 않으면 그것은 당신에게 (이 파일을 만듭니다)를 실행 makemigrations APP_NAME이 필요합니다
스콧 워렌

7

어쩌면 이것은 누군가를 도울 것입니다. 중첩 된 앱을 사용하고있었습니다. project.appname 그리고 실제로 INSTALLED_APPS에 project 및 project.appname이 있습니다. INSTALLED_APPS에서 프로젝트를 제거하면 변경 사항을 감지 할 수 있습니다.


7

답은 Django 1.7의 cdvv7788 Migrations에 의한이 stackoverflow 게시물에 있습니다.

해당 앱을 처음 마이그레이션하는 경우 다음을 사용해야합니다.

manage.py makemigrations myappname 그렇게하면 다음을 수행 할 수 있습니다.

manage.py migrate 데이터베이스에 앱이있는 경우 모델을 수정하고 아직 마이그레이션하지 않은 마이그레이션에 대한 변경 사항을 업데이트하지 않습니다. 모델을 원래 형식으로 다시 변경하고 첫 번째 명령 (앱 이름으로)을 실행 한 후 마이그레이션하면 가짜가됩니다. 모델에 변경 사항을 되 돌리면 makemigrations를 실행하고 다시 마이그레이션하면 작동합니다.

나는 똑같은 문제를 겪고 있었고 위의 작업을 완벽하게 수행했습니다.

django 앱을 cloud9로 옮겼으며 어떤 이유로 초기 마이그레이션을 한 적이 없었습니다.


7

다음은 나를 위해 일했습니다.

  1. settings.py에 앱 이름을 추가하십시오.
  2. 'python manage.py makemigrations'사용
  3. 'python manage.py migrate'를 사용하십시오.

나를 위해 일했습니다 : Python 3.4, Django 1.10


6

마이그레이션을 좋아하지 않는 나와 같은 사람들은 아래 단계를 사용할 수 있습니다.

  1. 동기화하려는 변경 사항을 제거하십시오.
  2. python manage.py makemigrations app_label초기 마이그레이션을 위해 실행하십시오 .
  3. python manage.py migrate변경하기 전에 테이블 작성을 위해 실행하십시오 .
  4. 첫 번째 단계에서 제거한 변경 사항을 붙여 넣습니다.
  5. 2 단계와 3 단계를 실행하십시오.

이러한 단계를 혼동 한 경우 마이그레이션 파일을 읽으십시오. 스키마를 수정하거나 원하지 않는 파일을 제거하도록 변경하지만 다음 마이그레이션 파일의 종속성 부분을 변경하는 것을 잊지 마십시오.)

이것이 앞으로 누군가를 도울 수 있기를 바랍니다.


5

목록 settings.py에서 를 확인하고 INSTALLED_APPS모델이있는 모든 앱이 목록에 있는지 확인하십시오.

makemigrations프로젝트 폴더에서 실행 한다는 것은 프로젝트에 포함 된 모든 앱과 관련된 모든 테이블을 업데이트하는 것을 의미합니다 settings.py. 당신이 그것을 포함되면 makemigrations자동으로 응용 프로그램을 (당신이 실행하지 않아도이 일을 많이 절약이 포함됩니다 makemigrations app_name프로젝트 / 사이트의 모든 앱).


5

makemigrations로 식별되지 않는 특정 필드가있는 경우 : 이름이 같은 속성이 있는지 두 번 확인하십시오.

예:

field = django.db.models.CharField(max_length=10, default = '', blank=True, null=True)

# ... later

@property
def field(self):
    pass

이 속성은 필드 정의를 "덮어 쓰므로"변경 내용이 식별되지 않습니다. makemigrations


관련 범퍼는 여전히 유효성 검사 / 확인을 벗어나는 잘못된 필드를 가져야합니다. 나는 정의 hourly_rate = models.DecimalField(후미 '()'를 놓치고) 방금 실패했습니다.
현인

5

모델이 아닌지 확인하십시오 abstract. 나는 실제로 그 실수를 저지르고 시간이 걸렸으므로 게시하겠다고 생각했다.


4

이 방법 만 도움이 되었으므로이 답변을 추가하십시오.

migrations폴더 실행 makemigrations및을 삭제했습니다 migrate.
그것은 여전히 ​​말했다 : 적용 할 마이그레이션이 없습니다.

나는 갔다 migrate, 폴더를 마지막으로 생성 된 파일을 열어
내가 원하는 마이그레이션을 (그것은 발견 된 거기에 입력) 의견을
실행 migrate다시.

기본적으로 마이그레이션 파일을 수동으로 편집합니다.
파일 내용을 이해 한 경우에만이 작업을 수행하십시오.


1
정말 고맙습니다! 도움이 됨
Sharpless512

3

schemamigration my_app --initial이전 마이그레이션 폴더 이름을 바꾼 후 사용 했습니까 ? 시도 해봐. 작동 할 수 있습니다. 그렇지 않은 경우-데이터베이스를 다시 작성하고 syncdb + migrate를 시도하십시오. 그것은 나를 위해 일했다 ...


10
어떤 명령도 schemamigration존재 하지 않습니다 -그것이 남쪽의 일부라고 생각합니까? 현재 마이그레이션 폴더가 없습니다. 내를 제거 models.py하고 다시 실행 inspectdb하는 것은 아무것도하지 않는 것 같습니다.
TyrantWave

2
schemamigration남쪽에서 왔어요 makemigrations대체입니다.
Craig Labenz

2
이것은 여전히 ​​유효합니다. 그러나 변경makemigrations --empty
Iulius 커트

2

같은 문제 가있는 경우 models.py에 정의한 클래스가 모델을 상속해야합니다.

class Product(models.Model):
    title = models.TextField()
    description = models.TextField()
    price = models.TextField()

1

나는 makemigrations를 두 번 실행하고 모든 종류의 이상한 행동을해야한다는 것과 같은 문제가있었습니다. 문제의 근원은 모델에서 기본 날짜를 설정하는 함수를 사용하여 마이그레이션을 수행 할 때마다 마이그레이션이 변경 사항을 감지했다는 것이 밝혀졌습니다. 이 질문에 대한 답은 올바른 길로 인도 했습니다. 날짜 필드를 다시 작성하기 위해 makemigrations를 피하십시오


1

최근에 Django를 1.6에서 1.8로 업그레이드했으며 앱과 마이그레이션이 거의 없었습니다. schemamigrationsDjango 1.6에서는 남쪽을 사용 하여 Django 1.6에서 마이그레이션을 만들었습니다.

업그레이드 후 새 모델을 추가했을 때 makemigrations명령에서 변경 사항을 감지하지 못했습니다. 그런 다음 @drojf (첫 번째 답변)에서 제안한 솔루션을 시도했지만 정상적으로 작동했지만 가짜 초기 마이그레이션 ( python manage.py --fake-initial) 을 적용하지 못했습니다 . 내 테이블 (이전 테이블)이 이미 생성 되었으므로이 작업을 수행했습니다.

마지막으로 이것은 나를 위해 일했고 models.py에서 새 모델 (또는 모델 변경 사항)을 제거한 다음 모든 앱의 마이그레이션 폴더를 삭제하거나 안전 백업을 위해 이름을 바꾼 manage.py다음 모든 앱에 대해 python makemigrations를 실행 해야했습니다 python manage.py migrate --fake-initial. 이것은 매력처럼 작동했습니다. 모든 앱에 대해 초기 마이그레이션이 생성되고 가짜 초기 마이그레이션이 완료되면 새 모델을 추가 makemigrations하고 해당 앱에서 정기적으로 프로세스를 수행 하고 마이그레이션합니다. 이제 변경 사항이 감지되었고 모든 것이 정상적으로 진행되었습니다.

누군가가 같은 문제에 직면했을 때 ( schemamigrations앱을 남쪽으로 사용하는 경우) 공유하는 것을 생각 했습니다. :)


1

어쩌면 그것은 누군가를 도울 수 있습니다. 나는 같은 문제가있었습니다.

이미 serializer 클래스와 뷰를 사용하여 두 개의 테이블을 만들었습니다. 그래서 업데이트하고 싶을 때이 오류가 발생했습니다.

나는이 단계를 따랐다 :

  1. 내가 만든 .\manage.py makemigrations app
  2. 나는 처형했다 .\manage.py migrate
  3. 두 테이블을 모두 지 웠습니다 models.py
  4. serializer 및 view 클래스에서 테이블에 대한 모든 참조를 삭제했습니다.
  5. 나는 단계를 실행 1하고 2.
  6. 내 변경 사항을 models.py
  7. 다시 단계를 실행했습니다 5.
  8. 모든 변경 사항을 복원했습니다.

Pycharm과 함께 일하는 경우 현지 역사가 매우 유용합니다.


1

어쩌면 이것은 누군가를 도울 것입니다.

나는 내 것을 삭제 models.py하고 진술 makemigrations을 만들 것으로 예상 했다 DeleteModel.

*.pyc파일 을 삭제 하십시오!


1
./manage makemigrations
./manage migrate

마이그레이션은 DB 변경 사항을 추적하므로 관리되지 않는 데이터베이스에서 관리되는 데이터베이스로 변경하는 경우 처리중인 모델과 관련된 데이터베이스 테이블이 최신 상태인지 확인해야합니다.

여전히 개발 모드에있는 경우 필자는 개인적으로 내 모델과 관련된 django_migrations 테이블뿐만 아니라 IDE에서 마이그레이션 파일을 삭제하고 위 명령을 다시 실행하기로 결정했습니다.

기억하십시오 : IDE에서 _001로 끝나고 데이터베이스에서 _003으로 끝나는 마이그레이션이있는 경우. Django는 업데이트 할 항목이 _004로 끝나는 마이그레이션 만 있는지 확인합니다.

2 (코드 및 DB 마이그레이션)는 서로 연결되어 작동합니다.

행복한 코딩.


1
  1. 동기화하려는 변경 사항을 제거하십시오.
  2. 초기 마이그레이션을 위해 python manage.py makemigrations app_label을 실행하십시오.
  3. 변경하기 전에 python manage.py migrate를 실행하여 테이블을 작성하십시오.
  4. 첫 번째 단계에서 제거한 변경 사항을 붙여 넣습니다.
  5. 2 단계 및 3 단계 실행

0

위에 사용할 수있는 다른 제품이 없기 때문에이 답변을 추가했습니다.

내 경우에는 더 이상한 일이 (무슨 일이 벌어지고 장고 1.7 버전 ) 내에서 models.py 나는했다 "여분" 나는 실행될 때 (이 빈 줄을이었다) 내 파일의 끝에 선 python manage.py makemigrations결과였다 명령을 : "변경 사항이 감지되지 않았습니다".

이 문제를 해결하기 위해 models.py 파일 의 끝에있는 이 "빈 줄" 을 삭제 하고 명령을 다시 실행했는데 모든 것이 수정되었으며 models.py의 모든 변경 사항 이 감지되었습니다!


장고 2.0 + 빈 줄이 필요하다고 생각합니다. 나는 당신이 친구의 행동과 반대로해야합니다
Sumit Kumar Saha

@SumitKumarSaha haha ​​현재 Django 1.7 버전을 사용하고 있으며 빈 줄은 마이그레이션 오류를 해결하기 위해 모든 것을 시도하는 2 시간의 이유였습니다. Sumit을 공유해 주셔서 감사합니다. 좋은 하루 보내세요
Huskie

0

아래 명령을 사용하여 초기 마이그레이션을 위조해야 할 수도 있습니다

python manage.py migrate --fake-initial

0

먼저이 솔루션은 heroku 서버에 배포하는 동안 동일한 문제에 직면 한 사람들에게 적용 가능하며 동일한 문제에 직면했습니다.

배포하려면 settings.py 파일에 django_heroku.settings (locals ())를 추가하는 필수 단계가 있습니다.

변경 사항 : 위의 줄을 django_heroku.settings (locals (), databases = False)로 변경하면 완벽하게 작동했습니다.


0

필자의 경우 모델이 정의 된 models 폴더 의 _ init _.py 파일에 모델을 추가해야했습니다 .

from myapp.models.mymodel import MyModel

-1

이 솔루션 중 어느 것도 나를 위해 효과가 없었기 때문에 내 2c를 추가했지만 이것이 효과가있었습니다 ...

방금 manage.py squashmigrations이전 마이그레이션 (django.migrations 데이터베이스 테이블의 파일과 라인 모두)을 실행 하고 제거했습니다.

마지막 마이그레이션 파일에서 다음과 같은 줄이 남았습니다.

replaces = [(b'my_app', '0006_auto_20170713_1735'), (b'my_app', '0007_auto_20170713_2003'), (b'my_app', '0008_auto_20170713_2004')]

이것은 장고를 혼란스럽게하고 이상한 행동을 일으켰습니다. 실행 manage.py makemigrations my_app하면 아무것도없는 것처럼 초기 마이그레이션이 다시 작성됩니다. replaces...라인을 제거하면 문제가 해결되었습니다!


-1

python manage.py makemigrations accounts 'accounts'에 대한 마이그레이션 : accounts \ migrations \ 0001_initial.py-모델 작성 고객-모델 태그 작성-모델 작성 제품-모델 작성 주문

참고 : 여기서 "계정"은 내 앱 이름입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.