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 haliyleid | 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ı)
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
@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) –
Güncelleme: problem çözüldü! Thx – jchung