2012-01-16 12 views
23

Django uygulamasının modelinde bazı değişiklikler yaptım ve bunları geliştirme makinemde taşımak için Güney'i kullandım (0004 ile 0009 arasındaki geçişler). Ancak bu değişiklikleri sunucuda taşımaya çalışırken "GhostMigrations" hatası alıyorum.Django South GhostMigrations özel durumu nedir ve nasıl hata ayıklıyorsunuz?

Hayalet göçünün ne olduğunu açıklayan çok iyi içerikler yok veya bunların nasıl hata ayıklanacağı. Google bu konuda yardımcı olmadı ve hayalet göçlerinden bahseden diğer SO soruları bu sorunu karşılamıyor (en yararlı soru here çoğunlukla iş akışıyla ilgiliydı). Django-güney IRC'sindeki yardımseverler, hayalet göçleri hakkında şunları söylemişlerdi: "bu, güneydeki tarihin (db'deki bir tablo), uygulandığını düşündüğü ancak geçiş dosyaları bulamadığı iki geçişi kaydettiği anlamına gelir" . Hata ayıklamanın nasıl tamamlanacağını şimdi anlamaya çalışıyorum.

Yardım için şimdiden teşekkür ederiz. Ben bu değişikliklerin ay önce yapılmış çünkü ben Güney göçler 0002 ve 0003 şikayetçi olduğunu görünce şaşırdı

Traceback (most recent call last): 
    File "manage.py", line 14, in <module> 
    execute_manager(settings) 
    File "/home/username/webapps/myproject/lib/python2.6/django/core/management/__init__.py", line 438, in execute_manager 
    utility.execute() 
    File "/home/username/webapps/myproject/lib/python2.6/django/core/management/__init__.py", line 379, in execute 
    self.fetch_command(subcommand).run_from_argv(self.argv) 
    File "/home/username/webapps/myproject/lib/python2.6/django/core/management/base.py", line 191, in run_from_argv 
    self.execute(*args, **options.__dict__) 
    File "/home/username/webapps/myproject/lib/python2.6/django/core/management/base.py", line 220, in execute 
    output = self.handle(*args, **options) 
    File "/home/username/lib/python2.6/South-0.7.3-py2.6.egg/south/management/commands/migrate.py", line 105, in handle 
    ignore_ghosts = ignore_ghosts, 
    File "/home/username/lib/python2.6/South-0.7.3-py2.6.egg/south/migration/__init__.py", line 171, in migrate_app 
    applied = check_migration_histories(applied, delete_ghosts, ignore_ghosts) 
    File "/home/username/lib/python2.6/South-0.7.3-py2.6.egg/south/migration/__init__.py", line 88, in check_migration_histories 
    raise exceptions.GhostMigrations(ghosts) 
south.exceptions.GhostMigrations: 

! These migrations are in the database but not on disk: 
    <bodyguard: 0002_auto__add_field_asset_is_reserved__add_field_asset_is_created__add_fie> 
    <bodyguard: 0003_auto__del_field_asset_is_reserved__add_field_asset_is_assigned> 
! I'm not trusting myself; either fix this yourself by fiddling 
! with the south_migrationhistory table, or pass --delete-ghost-migrations 
! to South to have it delete ALL of these records (this may not be good). 

:

İşte hatadır.

0001_initial.py 
0001_initial.pyc 
0002_auto__chg_field_asset_username__chg_field_asset_title__chg_field_asset.py 
0002_auto__chg_field_asset_username__chg_field_asset_title__chg_field_asset.pyc 
0003_auto__add_field_asset_is_reserved__add_field_asset_is_created__add_fie.py 
0003_auto__add_field_asset_is_reserved__add_field_asset_is_created__add_fie.pyc 
0004_auto__del_field_asset_is_reserved__add_field_asset_is_assigned.py 
0004_auto__del_field_asset_is_reserved__add_field_asset_is_assigned.pyc 
0005_auto__add_assetedit.py 
0005_auto__add_assetedit.pyc 
0006_auto__del_field_assetedit_user__add_field_assetedit_asset.py 
0006_auto__del_field_assetedit_user__add_field_assetedit_asset.pyc 
0007_auto__chg_field_assetedit_update_date.py 
0007_auto__chg_field_assetedit_update_date.pyc 
0008_auto__add_field_asset_activated_date.py 
0008_auto__add_field_asset_activated_date.pyc 
0009_auto__del_field_asset_activated_date__add_field_asset_activation_date.py 
0009_auto__del_field_asset_activated_date__add_field_asset_activation_date.pyc 
__init__.py 
__init__.pyc 

Bu: Burada

class Asset(models.Model): title = models.CharField(max_length=200, blank=True, null=True) user = models.ForeignKey(User, blank=True, null=True) is_assigned = models.NullBooleanField(blank=True, null=True) is_created = models.NullBooleanField(blank=True, null=True) is_active = models.NullBooleanField(blank=True, null=True) activation_date = models.DateTimeField(default=datetime.datetime.now, blank=True, null=True) class AssetEdit(models.Model): asset = models.ForeignKey(Asset, related_name="edits", blank=True, null=True) update_date = models.DateTimeField(default=datetime.datetime.now, blank=True, null=True) 

güney göçler klasörün içeriği şunlardır: Daha önce bugün yapılan değişiklikler Burada

0009. yoluyla değişimi ile 0004 idi modelim var south_migrationtable:

bu haliyle
id | app_name |         migration         |   applied    
----+-----------+-----------------------------------------------------------------------------+------------------------------- 
    1 | myapp  | 0001_initial                | 2011-10-14 22:07:11.467184-05 
    2 | myapp  | 0002_auto__add_field_asset_is_reserved__add_field_asset_is_created__add_fie | 2011-10-14 22:07:11.469822-05 
    3 | myapp  | 0003_auto__del_field_asset_is_reserved__add_field_asset_is_assigned   | 2011-10-14 22:07:11.471799-05 
(3 rows) 

Bu myapp_asset tablodur: django-güney "Ghosts" olarak göçler 0002 ve 0003 görmesinin nedeni

        Table "public.myapp_asset" 
    Column |   Type   |       Modifiers       
-------------+------------------------+-------------------------------------------------------------- 
id   | integer    | not null default nextval('myapp_asset_id_seq'::regclass) 
title  | character varying(200) | 
user_id  | integer    | 
is_assigned | boolean    | 
is_created | boolean    | 
is_active | boolean    | 
Indexes: 
    "myapp_asset_pkey" PRIMARY KEY, btree (id) 
    "myapp_asset_user_id" btree (user_id) 
Foreign-key constraints: 
    "myapp_asset_user_id_fkey" FOREIGN KEY (user_id) REFERENCES auth_user(id) DEFERRABLE INITIALLY DEFERRED 

ben çözemiyorum. Her ikisi de geçişler klasöründedir, geçişte "uygulanmış" olarak listelenir ve veritabanı geçişten sonra son durumla tutarlı gibi görünür. 0003.

(olası hatalar: gitme, 0002 bir özellik oluşturdu ve 0003 yeniden adlandırdı)

cevap

23

Bir şekilde, veritabanınız, göçmenler klasörünüzde bulamayacağı 0002 ve 0003 geçişlerini kaydetti. sizin dosya sisteminde

Göç 0002 geçmiş tablosunda o iken 0002_auto__chg_field_asset_username__chg_field_asset_title__chg_field_asset.py olduğunu 0002_auto__add_field_asset_is_reserved__add_field_asset_is_created__add_fie.py

sizin göçler klasörü farklı içerikleri varken Güney geçirilmiş olması gerekir (belki de gelişmesinde?). veritabanı göç 0004 de durumunu yansıtır gibi ne dediğini dayanarak

, bana bakıyor, ben size is_assigned alan katma noktasında göç masa seti bir python manage.py migrate myapp 0004 --fake --delete-ghost-migrations çalıştırın ve ediyorum 0005+ geçişlerini mutlu bir şekilde uygulayabilir.

Geçerli DB tablosunu eşleşmesine rağmen eşleşmesi gereken en iyi yolu biliyorsunuzdur!

+0

Teşekkürler Yuji. Hızlı soru: --delete-hayalet göçlerinde tam olarak ne oluyor? South, bu satırları güneyden göçmenlikten çıkarır ve bunları doğru sıralarla değiştirir mi? Ben soruyorum çünkü göçler 0002 ve 0003 oluşturulan alanlar zaten doldurulmuş. Güney bu verileri bırakmayacak ve yeniden üretmeyecek, değil mi? – jchung

+1

@Jared, hayır sadece 'south_migrationhistory' tablosunu değiştirecek. Yine de '--fake' belirtmeniz gerekecek, ancak güney, db'niz bu değişiklikleri (veya belki daha da fazlası) zaten yansıttığı için 2, 3 ve 4 numaralı "gerçek" geçişi uygulamada başarısız olacaktır. Sadece kod örnekleri) –

+0

Güncelleme: problem çözüldü! Thx – jchung

7

Onlar hayalet göçler kabul edilir çünkü veritabanında isimleri:

0002_auto__add_field_asset_is_reserved__add_field_asset_is_created__add_fie 
0003_auto__del_field_asset_is_reserved__add_field_asset_is_assigned 

listelemek dosya eşleşmiyor:

0003_auto__add_field_asset_is_reserved__add_field_asset_is_created__add_fie.py 
0004_auto__del_field_asset_is_reserved__add_field_asset_is_assigned.py 

numaraları dosya adının bir parçası olan ve mükemmel eşleşmelidir . Bu duruma nasıl eriştiğinizden emin değilim, ancak DB'nizin 0004 dosyanızdakiyle eşleştiğinden kesinlikle eminseniz, güney DB tablosuna 0002_auto__chg_field_asset_username__chg_field_asset_title__chg_field_asset ekleyebilir, ardından iki satırı güncelleştirerek sayıların dosya adlarınızla eşleşmesini sağlayabilirsiniz.

Bunu yapmadan önce her şeyi desteklemeniz gerektiğini söylemeye gerek yok.

+0

İlk geçiş işlemi (0001initial), geçişler klasöründe açıklandığı gibi hem 0001 hem de 0002 geçişlerini de içerir. Bu, göç numaralarının neden senkronizasyondan çıktığını açıklar. Açıkçası iş akışımdaki bir hata. Öyleyse eğer veritabanındaki satırları tamir edersem, South'u tekrar senkronize eder, değil mi? Daha sonra bu düzeltmeyi yaptıktan sonra, Güney'in göçü 0009'a (yani almaya çalıştığım yer) ilerletmesi için tekrar "göç ettir" i çalıştırır mıyım? – jchung

+0

Evet, ya da veritabanının şu anda temsil ettiği noktaya geçişi 'göç et - göç' - hayalet geçişlerini '--delete-ghost-migrations' argümanıyla birlikte gösterir ve siler. –

+0

Güncelleme: sorun çözüldü! Teşekkürler – jchung

İlgili konular