155 votes

Django.db.migrations.exceptions.InconsistentMigrationHistory

Lorsque j'exécute python manage.py migrate sur mon projet Django, je reçois l'erreur suivante :

Traceback (most recent call last):
File "manage.py", line 22, in 
execute_from_command_line(sys.argv)
File "/home/hari/project/env/local/lib/python2.7/site-     packages/django/core/management/__init__.py", line 363, in execute_from_command_line
utility.execute()
File "/home/hari/project/env/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 355, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "/home/hari/project/env/local/lib/python2.7/site-packages/django/core/management/base.py", line 283, in run_from_argv
self.execute(*args, **cmd_options)
File "/home/hari/project/env/local/lib/python2.7/site-packages/django/core/management/base.py", line 330, in execute
output = self.handle(*args, **options)
File "/home/hari/project/env/local/lib/python2.7/site-packages/django/core/management/commands/migrate.py", line 86, in handle
executor.loader.check_consistent_history(connection)
File "/home/hari/project/env/local/lib/python2.7/site-packages/django/db/migrations/loader.py", line 298, in check_consistent_history
connection.alias,
django.db.migrations.exceptions.InconsistentMigrationHistory: Migration admin.0001_initial is applied before its dependency account.0001_initial on database 'default'.

J'ai un modèle d'utilisateur comme ci-dessous :

class User(AbstractUser):
    place = models.CharField(max_length=64, null=True, blank=True)
    address = models.CharField(max_length=128, null=True, blank=True)

Comment puis-je résoudre ce problème ?

5 votes

Tout d'abord, supprimez toutes les tables de la base de données, supprimez tous les fichiers du dossier migrations sauf init.py, puis exécutez la migration.

0 votes

Comment supprimer toutes les tables ?

0 votes

Quelle base de données utilisez-vous ?

161voto

jackson Points 499

Étant donné que vous utilisez un modèle utilisateur personnalisé, vous pouvez d'abord commenter

INSTALLED_APPS = [
...
#'django.contrib.admin',
...
]

dans vos paramètres Installed_Apps. Ensuite, exécutez

python manage.py migrate.

Une fois terminé, décommentez

'django.contrib.admin'

0 votes

Oui, cela a résolu mon problème! J'ai changé le modèle d'utilisateur par défaut en modèle d'utilisateur abstrait et après toutes les migrations, une erreur s'est produite. Mais quand j'ai essayé ceci, cela a résolu mon problème!

58 votes

Ça ne fonctionne pas pour moi. Le message d'erreur est "Aucune application d'installation avec l'étiquette admin", dois-je supprimer tous les fichiers dans les migrations d'abord? Est-ce que quelqu'un sait comment résoudre cela ? Merci ~

7 votes

Veuillez vérifier ci-dessous la réponse de l'utilisateur9414732.

111voto

Airs Points 396

Commençons par aborder le problème avec la plupart des réponses sur cette page :

Vous n'avez jamais à supprimer votre base de données si vous utilisez correctement le système de migration de Django et vous ne devriez jamais supprimer les migrations une fois qu'elles ont été validées

Maintenant, la meilleure solution pour vous dépend de plusieurs facteurs incluant votre expérience avec Django, de votre compréhension du système de migration, et de la valeur des données dans votre base de données.

En bref, il y a deux façons de résoudre une erreur de migration.

  1. Prendre l'option nucléaire. Avertissement : ceci est seulement une option si vous travaillez seul. Si d'autres personnes dépendent des migrations existantes vous ne pouvez pas simplement les supprimer.

    • Supprimer toutes vos migrations et reconstruire un ensemble frais avec python3 -m manage makemigrations. Cela devrait résoudre tout problème que vous aviez avec des dépendances ou des incohérences dans vos migrations.
    • Supprimer l'intégralité de votre base de données. Cela va résoudre tout problème que vous aviez avec des incohérences entre votre schéma de base de données actuel et le schéma que vous devriez avoir en fonction de l'historique de vos migrations, et va résoudre tout problème que vous aviez avec des incohérences entre votre historique de migrations et vos fichiers de migrations précédents [c'est ce que le InconsistentMigrationHistory reproche].
    • Reconstruisez le schéma de votre base de données avec python3 -m manage migrate
  2. Déterminez la cause de l'erreur et résolvez-la, car (par expérience) la cause est presque certainement quelque chose de ridicule que vous avez fait. (Généralement résultant d'une mauvaise compréhension de la façon d'utiliser correctement le système de migration). Sur la base des erreurs que j'ai causées, il y a trois catégories.

    1. Incohérences avec les fichiers de migration. C'est assez commun lorsque plusieurs personnes travaillent sur un projet. Espérons que vos changements ne sont pas en conflit et que makemigrations --merge peut résoudre le problème, sinon quelqu'un va devoir revenir en arrière avec ses migrations jusqu'au point de divergence pour résoudre cela.
    2. Incohérences entre votre schéma et l'historique de vos migrations. Pour gérer cela, quelqu'un a probablement modifié le schéma de la base de données manuellement ou a supprimé des migrations. S'ils ont supprimé une migration, annulez leurs changements et réprimandez-les ; vous ne devriez jamais supprimer des migrations si d'autres en dépendent. S'ils ont modifié le schéma de la base de données manuellement, annulez leurs changements et réprimandez-les ; Django gère le schéma de la base de données, pas quelqu'un d'autre.
    3. Incohérences entre l'historique de vos migrations et vos fichiers de migrations. [C'est le problème de InconsistentMigrationHistory dont souffre la personne qui pose la question, et celui dont j'ai souffert en arrivant sur cette page]. Pour gérer cela, quelqu'un a probablement manipulé manuellement la table django_migrations ou a supprimé une migration après son application. Pour résoudre cela, vous allez devoir comprendre comment l'incohérence est survenue et la résoudre manuellement. Si votre schéma de base de données est correct et que c'est seulement l'historique de vos migrations qui est faux, vous pouvez éditer manuellement la table django_migrations pour résoudre cela. Si votre schéma de base de données est faux, vous devrez également le modifier manuellement pour le mettre en conformité avec ce qu'il devrait être.

Sur la base de votre description du problème et de la réponse que vous avez sélectionnée, je vais supposer que vous travaillez seul, que vous êtes nouveau sur Django et que vous ne vous souciez pas de vos données. Donc l'option nucléaire peut être la bonne pour vous.

Si vous n'êtes pas dans cette situation et que le texte ci-dessus vous semble être du charabia, alors je vous suggère de demander de l'aide sur la liste de diffusion des utilisateurs de Django. Il y a des personnes très serviables là-bas qui peuvent vous guider pour résoudre le désordre spécifique dans lequel vous vous trouvez.

Ayez confiance, vous pouvez résoudre cette erreur sans recourir à l'option nucléaire !

2 votes

Pour ceux qui sont intéressés: Dans mon cas, j'avais créé une migration temporaire pour créer des tables dans l'application B pendant que j'attendais que mon collègue termine les migrations personnalisées pour déplacer les tables de l'application A vers l'application B. Lorsque mon collègue a fini, j'ai rétabli ma migration temporaire et j'ai commencé à appliquer les migrations. Bam erreur. Non seulement j'avais oublié de désappliquer ma migration temporaire, mais j'avais réussi à nommer la migration temporaire de la même manière que la vraie. Pour le système de migration, la migration 0001_initial de l'application B qui dépendait de la migration 00XX_auto de l'application A avait été appliquée avant sa dépendance!

3 votes

Aussi horrible que tout cela paraisse, il était facile de résoudre le problème. Ma base de données avait le bon schéma, donc tout ce que j'avais à faire était d'ajouter manuellement 'A' '00XX_auto' à la table django_migrations, de sorte que mon historique reflète que les modifications de cette migration ont été appliquées. Compliqué, mais pas si difficile une fois que vous avez compris le problème.

1 votes

Vous ne pouvez pas simplement supprimer les migrations, vous devez également supprimer les fichiers pycache

69voto

Arpit Solanki Points 5230

Votre table django_migrations dans votre base de données est la cause de l'incohérence et supprimer toutes les migrations juste à partir du chemin local ne fonctionnera pas.

Vous devez vider la table django_migrations de votre base de données, puis essayer d'appliquer à nouveau les migrations. Cela devrait fonctionner, mais si ce n'est pas le cas, exécutez à nouveau makemigrations, puis migrate.

Note : n'oubliez pas de sauvegarder vos données.

7 votes

N'a pas fonctionné. Lorsque j'ai essayé de le migrer, il a signalé qu'une relation existe déjà. Notez que vous pouvez tronquer la table django_migrations avec cette commande : > python manage.py shell ``` from django.db import connection cursor = connection.cursor() cursor.execute("TRUNCATE TABLE django_migrations") ``` Et vous pouvez afficher la table de migration comme ceci : ``` from django.db.migrations.recorder import MigrationRecorder MigrationRecorder.Migration.objects.all() ```

6 votes

Il s'agit d'une idée terrible avec une forte probabilité de perte de données. Voir ma réponse ci-dessous.

1 votes

Pour résoudre un problème de développement local, cette solution a été la bonne pour moi - en fait, j'ai tout simplement supprimé l'intégralité de la base de données, et elle a été recréée avec toutes les migrations fraîchement exécutées. Mon problème était que j'avais exécuté une ancienne version d'une migration 0001_initial auparavant et que la nouvelle ne s'appliquait pas. Si vous souhaitez avoir un historique de migration propre pour la prod sans modifications inutiles, supprimer et régénérer les migrations en développement local avant d'envoyer ces migrations en prod me semble être une bonne pratique. D'autres commentaires et réponses soulignent que supprimer / effacer les migrations ne fonctionnera pas pour une base de données prod, ce qui est vrai.

62voto

Dr. Younes Henni Points 139

Voici comment résoudre cela correctement.

Suivez ces étapes dans votre dossier de migrations à l'intérieur du projet :

  1. Supprimez les fichiers _pycache_ et 0001_initial.
  2. Supprimez le db.sqlite3 du répertoire racine (faites attention, toutes vos données disparaîtront).
  3. sur le terminal exécutez : python manage.py makemigrations
    python manage.py migrate

Voilà.

7 votes

Et si nous ne voulons pas supprimer et que nous sommes en mode production. De plus, je n'utilise pas sqllite, c'est MySQL sur notre serveur. Quelle est la meilleure méthode sans perdre de données.

1 votes

Seule réponse ici qui a fonctionné pour moi. Merci.

1 votes

Réponse parfaite

35voto

kun shi Points 41

Problème

django.db.migrations.exceptions.InconsistentMigrationHistory: Migration admin.0001_initial est appliquée avant sa dépendance account.0001_initial sur la base de données 'default'.

Nous pouvons donc migrer la base de données sans admin (admin.0001_initial) en premier.

Après que sa dépendance ait été migrée, exécutez les commandes pour migrer admin.0001_initial.

Solution

  1. supprimer 'django.contrib.admin' de INSTALLED_APPS dans le fichier settings.py.
  2. exécuter les commandes :

Python manage.py makemigrations nom_application

Python manage.py migrate nom_application

  1. ajouter 'django.contrib.admin' à INSTALLED_APPS dans le fichier settings.py.
  2. exécuter à nouveau les commandes :

Python manage.py makemigrations nom_application

Python manage.py migrate nom_application

9 votes

Pour moi, supprimer 'django.contrib.admin' des INSTALLED_APPS et exécuter makemigrations résulte en LookupError: No installed app with label 'admin'.

5 votes

Aller dans urls.py et commenter les urls avec admin

1 votes

A fonctionné pour moi en suivant les deux suggestions. Merci!

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X