2010-11-07 22 views
18

j'ai rencontré le même problème présenté par l'intervenant ici: Django South - table already existsNo Such colonne Erreur dans Django App Après la migration Sud

Il n'y avait pas de suivi, donc je pensais que je poste une nouvelle question. J'ai une application Django dont je gère les migrations avec South. J'ai ajouté un champ à mon modèle puis a couru

./manage schemamigration my_app --auto 

qui a fonctionné comme prévu. Exécution

./manage migrate my_app 

Cependant, une erreur est survenue indiquant que la table associée au modèle I modifié existe déjà. Cela m'a conduit à la question liée ci-dessus, donc en cours d'exécution

./manage migrate my_app --fake 

résoudre l'erreur de la table, mais maintenant je reçois une erreur Django que la colonne associée au nouveau champ n'existe pas.

./manage sqlall my_app 

montre que le schéma est comme prévu.

Toutes les réflexions sur la façon d'y remédier sont appréciées!

Répondre

32

La manière la plus facile pour vous sera de commencer les migrations à partir de zéro.

Supprimez tous les fichiers migrations/* de l'application que vous essayez de réparer. Restaurez votre models.py à l'état qui est actuellement sur la base de données (à l'aide des outils de contrôle de version, ou commentez simplement les nouveaux champs). Puis initialiser les migrations:

manage.py migrate my_app --delete-ghost-migrations 
manage.py schemamigration my_app --init 
manage.py migrate my_app --fake 

Cela va créer un enregistrement dans les migrations de ce que la structure de base de données actuelle ressemble.

Maintenant, ajoutez vos modifications models.py et au sud maintenant ce qui a changé:

manage.py schemamigration my_app --auto 
manage.py migrate my_app 
+0

Assurez-vous également de supprimer toutes les entrées de la base de données sur les migrations de schémas que le sud a déjà effectuées auparavant (si vous avez foiré). @drew: votre erreur principale était que vous auriez dû faire la migration initali et lancer './manage migrer my_app --fake' AVANT d'ajouter le nouveau champ au modèle! –

+1

@lazerscience 'manage.py migrer mon_app --delete-ghost-migrations' fait l'affaire. – Ski

+0

Oh désolé. J'ai négligé cela en quelque sorte ... –

5

Autre chose à garder un œil sur vous obtiendrez souvent cette erreur (DatabaseError: no such column: appname_model.fieldname) si vous utilisez une valeur default dans une relation ForeignKey, et vous ajoutez un champ à ce modèle FK.

Quelque chose comme (dans votre models.py):

class MyAppModel(models.Model): 
    my_foreign_key = models.ForeignKey(FkModel, 
             default=lambda: FkModel.objects.get(id=1), 
             null=True) 

Puis dans une nouvelle migration, vous ajoutez un nouveau champ à votre FkModel:

class FkModel(models.Model): 
    new_field = models.IntegerField('New Field Name', blank=True, null=True) 

Vous obtiendrez une erreur lors de l'exécution d'un Sud schemamigration:

DatabaseError: no such column: myappmodel_fkmodel.new_field

Vous pouvez résoudre ce problème en vous assurant que votre migration Sud initiale inclut cette valeur par défaut lambda, mais supprimez la valeur par défaut lors de la migration suivante.

Cela m'a mordu dans le passé. J'espère que cela aidera quelqu'un à l'avenir.