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:
- j'ai supprimé tous les fichiers de migration pour chaque modèle
- supprimé tous les enregistrements dans django_migrations
- 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.
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:
Supprimer toutes les migrations
supprimer les enregistrements de
django_migrations
ajouter Manuellement
name
colonne:ALTER TABLE django_content_type ADD COLUMN name character varying(50) NOT NULL DEFAULT 'someName';
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.
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:
dites à Django, que tous les types de migrations contentt ont été appliqués:
manage.py migrate --fake contenttypes
. Si vous voulez vérifier, runshowmigrations
.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'application0002_auto_20160616_0713
, la dernière migration appliquée avec succès dans votre base de données était0001_initial
. Wen enforce alors l'entrée dans ledjango_migrations
tablepython 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.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.
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 utilisantpython 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.
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é.
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
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!
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)