Qu'est-ce que Django Sud GhostMigrations exception et comment le corriger?
Apporté quelques modifications à mon Django app de modèle et utilisé Sud de migrer sur ma machine de développement (migrations 0004 par 0009). Mais lorsque j'essaie de migrer ces modifications sur le serveur, j'obtiens un "GhostMigrations d'erreur".
Il n'y a pas beaucoup de bon contenu expliquant ce qu'est un fantôme de la migration est, ou comment déboguer un. Google n'était pas utile sur ce l'un et l'autre pour des questions de mentionner fantôme migrations de ne pas couvrir ce soit (le plus utile question ici était surtout sur le plan de travail). Les gens de plus en django-sud IRC avait ceci à dire à propos de ghost migrations: "il s'agit du sud de l'histoire (une table dans la db) enregistre deux migrations qu'il pense avoir été appliquée, mais dont les fichiers de migration il ne peut pas trouver". Je suis à essayer de comprendre maintenant comment effectuer le débogage.
Merci d'avance pour l'aide.
Voici l'erreur:
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).
J'ai été surpris de voir que le Sud se sont plaints sur les migrations 0002 et 0003, parce que j'ai fait ces changements, il y a des mois. Les modifications que j'ai faite plus tôt aujourd'hui ont été les changements 0004 par 0009.
Voici mon modèle:
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)
Voici le contenu du sud migrations dossier:
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
C'est le 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)
C'est le myapp_asset tableau tel qu'il est actuellement:
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
Je ne peux pas comprendre pourquoi django-sud considère les migrations 0002 et 0003 être des "Fantômes". Deux d'entre eux sont dans les migrations dossier, sont répertoriés comme "appliquée" dans le migrationtable, et la base de données semble être compatible avec l'état final après la migration 0003.
(erreurs possibles: les migrations dossier a été inclus dans le repo git; migration 0002 créé un attribut, puis 0003 renommé)
Vous devez vous connecter pour publier un commentaire.
En quelque sorte, votre base de données a enregistré des migrations 0002 et 0003 qui il ne peut pas trouver dans votre migrations dossier.
Migration
0002
dans votre système de fichiers est0002_auto__chg_field_asset_username__chg_field_asset_title__chg_field_asset.py
tandis que la dans le dans le la table d'historique c'est0002_auto__add_field_asset_is_reserved__add_field_asset_is_created__add_fie.py
Sud doit avoir été migré lors de votre migrations dossier a un contenu différent (peut-être dans le développement?).
Basé sur ce que vous dites, il me semble que votre base de données reflète l'état à la migration
0004
, alors j'aimerais exécuter unpython manage.py migrate myapp 0004 --fake --delete-ghost-migrations
qui servira de tableau de migration au point que vous avez ajouté leis_assigned
champ, et vous vous ferez un plaisir d'appliquer les migrations0005+
.Vous savez le meilleur de la migration, le courant de la table DB devrait match tout de même!
south_migrationhistory
table. Vous aurez toujours besoin de spécifier--fake
mais parce que le sud ne seront pas en mesure d'appliquer le "réel" de la migration à 2, 3, et 4 db déjà reflète ces changements (ou peut-être même plus - mais je ne peux pas dire à partir de votre code échantillons seul)Ils sont considérés comme des fantômes migrations parce que les noms dans la base de données:
ne correspondent pas aux noms de fichier que vous liste:
Les chiffres sont une partie du nom de fichier et doit correspondre parfaitement. Je ne suis pas sûr de savoir comment vous avez atteint cet état, mais si vous êtes absolument sûr que votre DB correspond à ce qui est dans votre 0004 fichier, vous pouvez ajouter
0002_auto__chg_field_asset_username__chg_field_asset_title__chg_field_asset
au sud de la table DB, puis mettre à jour le deux lignes, donc les chiffres correspondent à vos noms de fichiers.Inutile de dire que vous devez tout sauvegarder avant de le faire.
migrate myapp --fake
la migration jusqu'à le point, vous savez que votre base de données représente actuellement et supprimer le fantôme migrations avec la--delete-ghost-migrations
argument.