2012-04-13 3 views
4

방금 ​​South을 추가 한 기존 Django 프로젝트가 있습니다.Django와 Heroku에서 South를 사용하는 데 문제가 있습니다.

  • 로컬로 syncdb를 실행했습니다.
  • 나는 내가 커밋 로컬
  • manage.py migrate app_name --fake를 실행
  • 로컬 manage.py schemamigration app_name를 실행하고 나는 내가 Heroku가
  • manage.py migrate app_name를 실행
  • 에게 Heroku에 manage.py schemamigration app_name를 실행
  • 에게 Heroku에 syncdb 달렸다
  • Heroku가 마스터에 밀려

다음 메시지가 나타납니다.

$ heroku run python notecard/manage.py migrate notecards 
Running python notecard/manage.py migrate notecards attached to terminal... up, run.1 
Running migrations for notecards: 
- Migrating forwards to 0005_initial. 
> notecards:0003_initial 
Traceback (most recent call last): 
    File "notecard/manage.py", line 14, in <module> 
    execute_manager(settings) 
    File "/app/lib/python2.7/site-packages/django/core/management/__init__.py", line 438, in execute_manager 
    utility.execute() 
    File "/app/lib/python2.7/site-packages/django/core/management/__init__.py", line 379, in execute 
    self.fetch_command(subcommand).run_from_argv(self.argv) 
    File "/app/lib/python2.7/site-packages/django/core/management/base.py", line 191, in run_from_argv 
    self.execute(*args, **options.__dict__) 
    File "/app/lib/python2.7/site-packages/django/core/management/base.py", line 220, in execute 
    output = self.handle(*args, **options) 
    File "/app/lib/python2.7/site-packages/south/management/commands/migrate.py", line 105, in handle 
    ignore_ghosts = ignore_ghosts, 
    File "/app/lib/python2.7/site-packages/south/migration/__init__.py", line 191, in migrate_app 
    success = migrator.migrate_many(target, workplan, database) 
    File "/app/lib/python2.7/site-packages/south/migration/migrators.py", line 221, in migrate_many 
    result = migrator.__class__.migrate_many(migrator, target, migrations, database) 
    File "/app/lib/python2.7/site-packages/south/migration/migrators.py", line 292, in migrate_many 
    result = self.migrate(migration, database) 
    File "/app/lib/python2.7/site-packages/south/migration/migrators.py", line 125, in migrate 
    result = self.run(migration) 
    File "/app/lib/python2.7/site-packages/south/migration/migrators.py", line 99, in run 
    return self.run_migration(migration) 
    File "/app/lib/python2.7/site-packages/south/migration/migrators.py", line 81, in run_migration 
    migration_function() 
    File "/app/lib/python2.7/site-packages/south/migration/migrators.py", line 57, in <lambda> 
    return (lambda: direction(orm)) 
    File "/app/notecard/notecards/migrations/0003_initial.py", line 15, in forwards 
    ('user', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['auth.User'])), 
    File "/app/lib/python2.7/site-packages/south/db/generic.py", line 226, in create_table 
    ', '.join([col for col in columns if col]), 
    File "/app/lib/python2.7/site-packages/south/db/generic.py", line 150, in execute 
    cursor.execute(sql, params) 
    File "/app/lib/python2.7/site-packages/django/db/backends/util.py", line 34, in execute 
    return self.cursor.execute(sql, params) 
    File "/app/lib/python2.7/site-packages/django/db/backends/postgresql_psycopg2/base.py", line 44, in execute 
    return self.cursor.execute(query, args) 
django.db.utils.DatabaseError: relation "notecards_semester" already exists 

세 가지 모델이 있습니다. 섹션, 학기 및 노트 카드. Notecards 모델에 하나의 필드를 추가했는데 Heroku에서 추가 할 수 없습니다.

감사합니다.

답변

5

테이블을 만드는 마이그레이션을 가짜로 만든 다음 평소와 같이 다른 마이그레이션을 실행해야합니다.

manage.py migrate app_name 000X --fake 
manage.py migrate app_name 

000X는 테이블을 만드는 마이그레이션의 번호입니다.

+0

저는 manage.py migrate app_name 0005 --fake heroku를 실행합니다. 그리고 manage.py migrate app_name을 실행하면'Nothing to migrate '라는 메시지가 나타납니다. app_name의 초기 데이터로드 중. 비품이 발견되지 않았습니다. ' –

+1

네, 마이그레이션이 완전히 엉망이되었습니다. 마이그레이션 전부터 시작하여 dev 및 prod에 대해 수행 한 작업의 전체적인 내역을 보유하지 않으면 도움이 될 수 없을 것입니다. 세부 사항이 필요합니다. 그들 중 많은 것들. 작성한 모든 코드를 작성한 다음 수정 한 모든 사항, 실행 한 모든 마이그레이션 명령 및 시스템을 입력하십시오. 전체리스트. –

+0

감사합니다. 나는 이것을 할 수있다. 한 가지 더 쉽게 작업 할 수있는 방법은 ... 코드의 모델을 한 번 변경하면됩니다. 단일 필드에 단일 모델을 추가했습니다. 나는이 필드를 쉽게 제거하고 사우스 캐롤라이나 이전 데이터베이스의 원래 상태로 돌아갈 수있었습니다. 이렇게하면 마이그레이션 폴더를 삭제하고 다시 시작할 수 있습니까 - 올바른 방법입니까?그렇지 않다면 최대한 많은 정보를 수집 할 것입니다. 감사! –

1

우선, 0003_initial 및 0005_initial의 모양에서 create_table 문을 추가하는 복수 schemamigration myapp --initial 명령을 수행했습니다. 이들 중 두 세트를 사용하면 테이블을 생성 할 때 문제가 발생할 것이고 다음 테이블은 기존 테이블을 생성하려고 시도 할 것이므로 문제가 발생할 것입니다.

migrations 폴더가 이상한 마이그레이션으로 완전히 오염되었을 수 있습니다.

어쨌든 로컬 시스템과 원격 시스템에서 schemamigration을 실행하는 이론을 이해하고 있지만 이는 아마도 문제의 근원 일 것입니다. Schemamigration은 새로운 마이그레이션을 생성합니다. 개발 서버에서 실행하고 커밋하고 푸시 한 다음 프로덕션 시스템에서 또 다른 프로덕션을 생성해야하는 경우 중복 마이그레이션이 발생할 수 있습니다.

또 다른 한가지 : 원격 컴퓨터에서 syncdb를 실행 중이고 테이블을 생성 중이라면 데이터베이스가 100 % 최신이라는 것을 의미합니다. 마이그레이션이 필요하지 않습니다. 데이터베이스로의 이전과 일치시키기 위해 전체 migrate --fake을 수행 할 것입니다.

I ran syncdb locally. 
I ran manage.py schemamigration app_name locally 
I ran manage.py migrate app_name --fake locally 
I commit and pushed to heroku master 
I ran syncdb on heroku 

I ran manage.py schemamigration app_name on heroku 
# if you ran syncdb, your DB would be in the final state. 
I ran manage.py migrate app_name on heroku 
# if you ran syncdb, your DB would be in the final state. Nothing to migrate. 
+1

감사합니다. 문제가 어떻게 발생했는지에 대한 귀하의 설명이 훌륭하지만, 현재이 문제를 실제로 해결하는 방법에 여전히 중점을두고 있습니다. 당신은 syncdb를 실행하면 DB가 최종 상태가 될 것이라고 말합니다 - 그렇지 않습니다. 내가 Heroku에서 마이그레이션을 0005 (최종 상태)로 가짜로 만든 다음 마이그레이션을 다시 실행하면 마이그레이션 할 대상이 없습니다. app_name의 초기 데이터로드 중. 정착물이 없다 .' –

관련 문제