Colonne Django " nom "de la relation" type de contenu django" n'existe pas

j'obtiens l'erreur suivante lors d'une migration (python manage.py migrer):

django.db.utils.ProgrammingError: column "name" of relation "django_content_type" does not exist

j'ai fait ce qui suit pour essayer de le réparer, mais sans succès:

  1. j'ai supprimé tous les fichiers de migration pour chaque modèle
  2. supprimé tous les enregistrements dans django_migrations
  3. exécuter python manage.py migrer --faux-initiale

En Cours D'Exécution Django 1.8.2.

python manage.py showmigrations
admin
 [ ] 0001_initial
auth
 [ ] 0001_initial
 [ ] 0002_alter_permission_name_max_length
 [ ] 0003_alter_user_email_max_length
 [ ] 0004_alter_user_username_opts
 [ ] 0005_alter_user_last_login_null
 [ ] 0006_require_contenttypes_0002
contenttypes
 [X] 0001_initial
 [ ] 0002_remove_content_type_name
hashtags
 [ ] 0001_initial
 [ ] 0002_hashtagvisit_user
posts
 [ ] 0001_initial
 [ ] 0002_auto_20150530_0715
sessions
 [ ] 0001_initial
users
 [ ] 0001_initial

Merci pour votre aide.

18
demandé sur Yannick 2015-05-30 14:25:04

6 réponses

rencontré ceci lors de la mise à niveau vers 1.8 et de la migration de MySQL vers Postgres.

Je ne peux pas expliquer pourquoi l'erreur se produit, mais j'ai pu La contourner en ajoutant manuellement la colonne:

  1. Supprimer toutes les migrations

  2. supprimer les enregistrements de django_migrations

  3. ajouter Manuellement name colonne:

    ALTER TABLE django_content_type ADD COLUMN name character varying(50) NOT NULL DEFAULT 'someName';
    
  4. lancer une fausse initiale: $ python manage.py migrate --fake-initial

Modifier 12/2016: je recommande cette solution comme solution de contournement, plus adaptée aux projets personnels ou aux environnements locaux et non aux environnements de production. De toute évidence, si vous vous souciez de votre passé migratoire, ce n'est pas la voie à suivre.

23
répondu John M. 2016-12-15 19:46:13

j'ai rencontré le même problème aujourd'hui, et je voudrais ajouter un résumé du problème et comment le résoudre:

Source du Problème:

Django 1.8 a changé ses structures internes de base de données et la colonne name n'existe plus dans la base de données (voir est tiré de l'attribut verbose_name du model).

À cette adresse, une migration contenttypes -0002_remove_content_type_name est automatiquement créé.

Habituellement, toutes vos migrations devraient avoir été effectuées et cela devrait être enregistré dans le tableau django_migrations et tout devrait aller bien.

si vous avez par exemple fait une sauvegarde de votre base de données en utilisant dumpdata, effacé (vidé) tout le contenu de la base de données, et chargé le dump avec loaddata, votre django_migrations tableau reste vide.

ainsi,migrate essaie d'appliquer à nouveau toutes les migrations (même si vos tables existent), et il échoue quand il essaie de supprimer la colonne non-existante name.

vous pouvez vérifier si cette situation s'applique en cochant votre django_migrations table, ou - beaucoup plus conventient - en exécutant python manage.py showmigrations. Si votre situation ressemble à

contenttypes
 [X] 0001_initial
 [X] 0002_remove_content_type_name

vous êtes beaux (ou, en fait, vous rencontrez un autre problème), dans le cas où il ressemble à ceci

contenttypes
 [ ] 0001_initial
 [ ] 0002_remove_content_type_name

vous avez rencontré la situation décrite ci-dessus. Veuillez vérifier que votre base de données contient tous les tableaux et toutes les colonnes (à l'exception des modifications que vous souhaitez appliquer). avec votre migration ratée).

Que faire / étape par Étape de la Solution:

donc notre structure de base de données est ok (sauf pour les changements que vous vouliez appliquer avec votre migration ratée), mais Django / migrate ne le sait tout simplement pas. Donc, nous allons faire quelque chose à ce sujet:

  1. dites à Django, que tous les types de migrations contentt ont été appliqués:manage.py migrate --fake contenttypes. Si vous voulez vérifier, run showmigrations.

  2. ne Pas laisser de dire Django, que toutes les migrations avant celui que vous souhaitez appliquer ont été appliquées. Pour cela, vous avez besoin du numéro de migration indiqué par showmigrations. Par exemple, si votre situation ressemble à

    my_app
     [ ] 0001_initial
     [ ] 0002_auto_20160616_0713
    

    et migrate a échoué lors de l'application 0002_auto_20160616_0713, la dernière migration appliquée avec succès dans votre base de données était 0001_initial. Wen enforce alors l'entrée dans le django_migrationstable python manage.py migrate --fake my_app 0001 (rappelez-vous que le nombre de migrations est suffisant). migrate automatiquement faux toutes les autres migrations dépendantes si nécessaire.

  3. maintenant nous pouvons appliquer la migration de missiong, et cette fois nous devons le faire pour de vrai et pas pour de faux! Nous avons donc run python manage.py migrate my_app. Cela devrait modifier la base de données que nécessaire.

    si votre dernière migration dépend d'autres migrations qui n'ont pas déjà été simulées, vous devez les simuler à l'avance.

  4. Double-vérifier et de nettoyage: Utiliser showmigrations encore une fois pour vérifier si toutes les migrations mave été appliquée. S'il y a des migrations ouvertes, falsifiez-les en utilisant python manage.py migrate --fake.

choses que vous ne devriez pas faire

  • supprimer toutes les migrations - dans un contexte de production, cela pourrait ne pas être applicable car elles pourraient contenir du travail de migration de données qui ne devrait pas être perdu.
  • ajouter manuellement la colonne name pour contenttypes - il sera supprimé par la suite lorsque la migration est appliquée. Ok, c'est un hack qui marche, mais ça marche. pas de adresse le problème.

Choses que vous devriez faire

essayez de comprendre comment vous êtes entré dans cette situation et de trouver des moyens de l'éviter.

mon problème était que j'avais différentes bases de données pour mon projet (sqlite pour les tests de développement rapide, postgres locaux pour les tests du monde réel, Postgres distants pour la production) et je voulais copier du contenu de l'un à l'autre.

22
répondu OBu 2016-06-16 13:25:53

j'ai eu cette erreur après que nous ayons décidé de supprimer les migrations du contrôle de version (git) et de créer une nouvelle base de données à partir de zéro.

quelque chose qui a fonctionné pour moi (même si pour être honnête je ne sais pas pourquoi) était d'exécuter 'makemigrations' pour chaque application. alors, python manage.py makemigrations app1', 'python manage.py MAK emigrations app2', et ainsi de suite pour chaque application Django.

enfin, je viens de courir ' python manage.py migrer, croiser les doigts, travaillé.

il serait utile de savoir comment et pourquoi cela a fonctionné.

4
répondu Joe Fusaro 2015-12-04 21:57:12

je sais que c'est une vieille question, mais cela peut aider quelqu'un. J'ai été faire cette erreur. Le problème est que content_types avait une migration appelé 0002_remove_content_type_name supprimer la colonne "nom".

Après supprimer les données de migration de la table et du dossier cette étape fonctionne pour moi:

./manage.py makemigrations myappname
./manage.py migrate myappname
./manage.py migrate --fake contenttypes

Si vous avez assurez-vous que le reste de votre db refléter votre migration, vous pouvez utiliser:

./manage.py migrate --fake

Voir la suite avec:

./manage.py showmigrations

après cela, toutes vos migrations devraient être marquées et vous devriez être bien

2
répondu Descio 2016-06-16 06:16:56

j'ai eu le MÊME PROBLÈME MAIS j'ai pu le résoudre en ajoutant ceci à mes dépendances de migration:

('contenttypes', '0002_remove_content_type_name')

j'Espère que ça aide!

1
répondu danielmaxx 2016-11-28 00:10:33

une autre variante qui a fonctionné pour moi (à partir d'une base de données vierge) était:

./manage.py makemigrations myappname
./manage.py migrate

une variante qui n'a pas fonctionné était:

./manage.py makemigrations myappname
./manage.py migrate myappname

Ou, plutôt, la séquence serait apparemment le travail la première fois, mais ne serait pas travailler la deuxième fois, se plaindre alors que django_content_type n'existe pas.

la variante de travail (première ligne) ci-dessus semble être idempotent.

(édité: pour supprimer redondant deuxième ligne à partir de l'original 3-ligne version de travail)

0
répondu jonseymour 2017-12-13 22:59:01