Was ist eine Django South GhostMigration-Ausnahme und wie debuggen Sie sie?
Paar Veränderungen in meinem Django-app-Modell und verwendet Süden migrieren Sie auf meiner Entwicklungs-Maschine (Migrationen durch 0004 0009). Aber wenn Sie versuchen zu migrieren, diese änderungen auf den server, bekomme ich ein "GhostMigrations" Fehler.
Gibt es nicht viel guten Inhalt zu erklären, was ein ghost migration ist, oder Debuggen. Google war nicht hilfreich, auf diese und andere Fragen zu erwähnen, Geist Migrationen nicht abdecken, diese entweder (nach den hilfreichsten Frage hier wurde größtenteils über workflow). Der hilfreiche Leute in der django-Süd IRC hatte dies zu sagen über den Geist von Migrationen: "es bedeutet Süden-Geschichte (eine Tabelle in der db) erfasst zwei Migrationen, dass es denkt, die angewendet wurden, aber deren migration-Dateien nicht finden kann". Ich versuche, herauszufinden, nun, wie der debug.
Vielen Dank im Voraus für die Hilfe.
Hier der Fehler:
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).
War ich überrascht zu sehen, dass Süden Beklagten sich über Migrationen 0002 und 0003, weil ich diese Veränderungen Monaten. Die änderungen, die ich gemacht früher heute waren die Veränderungen durch 0004 0009.
Hier ist mein Modell:
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)
Hier sind die Inhalte der Süd-Migrationen Ordner:
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
Dies ist die south_migrationtable:
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)
Dies ist die myapp_asset Tabelle, wie es aktuell steht:
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
Ich kann nicht herausfinden, warum django-Süd ist der Auffassung Migrationen 0002 und 0003 "Geister". Beide sind im Migrations-Ordner aufgeführt sind, als "angewandte" in der migrationtable, und die Datenbank scheint konsistent zu sein mit den end-Stand nach der migration 0003.
(mögliche Fehler: die Migrationen Ordner enthalten war, in das git-repo; migration 0002 ein Attribut erstellt, und dann 0003 umbenannt)
InformationsquelleAutor der Frage jchung | 2012-01-16
Du musst angemeldet sein, um einen Kommentar abzugeben.
Irgendwie, Ihre Datenbank aufgenommen hat-Migrationen 0002 und 0003 die es nicht finden können in Ihrem Migrationen Ordner.
Migration
0002
im Dateisystem ist0002_auto__chg_field_asset_username__chg_field_asset_title__chg_field_asset.py
während die in der history-Tabelle ist es0002_auto__add_field_asset_is_reserved__add_field_asset_is_created__add_fie.py
Süd muss migriert wurden, wenn Sie Ihre Migrationen Ordner hatten unterschiedliche Inhalte (vielleicht in Entwicklung?).
Basierend auf dem, was du sagst, es sieht für mich so aus Ihrer Datenbank spiegelt den Zustand migration
0004
so möchte ich ausführen einerpython manage.py migrate myapp 0004 --fake --delete-ghost-migrations
wird die migration Tabelle an der Stelle Hinzugefügt, dieis_assigned
Feld, und Sie können gerne anwenden Migrationen0005+
.Würden Sie wissen am besten, welche die migration der aktuellen DB-Tabelle sollte passen aber!
InformationsquelleAutor der Antwort Yuji 'Tomita' Tomita
Werden Sie als ghost-Migrationen, da die Namen in der Datenbank:
nicht mit den Dateinamen, die Sie auflisten:
Die zahlen sind Bestandteil des Dateinamens und muss perfekt Stimmen. Ich bin mir nicht sicher, wie Sie Sie erreicht dieses Staates, aber, wenn Sie absolut sicher sind, dass Ihre DB entspricht, was in deinem 0004-Datei, die Sie hinzufügen könnte
0002_auto__chg_field_asset_username__chg_field_asset_title__chg_field_asset
südlich DB-Tabelle, aktualisieren Sie dann die zwei Zeilen, so dass die zahlen entsprechen deine Dateinamen.Unnötig zu sagen, Sie sollten sichern Sie alles bevor Sie dies tun.
InformationsquelleAutor der Antwort dgel