Django 1.7 - makemigrations pas la détection des changements
comme le titre le dit, Je n'arrive pas à faire fonctionner les migrations.
l'application était à l'origine sous 1.6, donc je comprends que les migrations ne seront pas là initialement, et en effet si je cours python manage.py migrate
je reçois:
Operations to perform:
Synchronize unmigrated apps: myapp
Apply all migrations: admin, contenttypes, auth, sessions
Synchronizing apps without migrations:
Creating tables...
Installing custom SQL...
Installing indexes...
Running migrations:
No migrations to apply.
si je fais un changement à n'importe quel modèle dans myapp
, il dit toujours non émigré, comme prévu.
mais si je cours python manage.py makemigrations myapp
j'obtiens:
No changes detected in app 'myapp'
ne semble pas avoir d'importance ou comment j'exécute la commande, il ne détecte jamais l'application comme ayant des changements, ni n'ajoute de fichiers de migration à l'application.
y a-t-il un moyen de forcer une application sur les migrations et de dire essentiellement "C'est ma base pour travailler avec" ou autre chose? Ou ai-je raté quelque chose?
ma base de données est une PostgreSQL si cela peut aider.
23 réponses
si vous changez d'une application existante que vous avez créée dans django 1.6, alors vous devez faire une étape préalable (comme je l'ai découvert) listée dans la documentation:
python manage.py makemigrations your_app_label
la documentation ne rend pas évident que vous devez ajouter l'étiquette app à la commande, car la première chose qu'elle vous dit de faire est python manage.py makemigrations
qui échouera. Initial la migration est faite lorsque vous créez votre application dans la version 1.7, mais si vous venez de 1.6, elle n'aurait pas été effectuée. Voir le " ajouter la migration aux applications " dans la documentation pour plus de détails.
Ok, on dirait que j'ai manqué une étape évidente, mais en postant ceci au cas où quelqu'un d'autre ferait la même chose.
lors de la mise à niveau à 1.7, mes modèles sont devenus non - gérés ( managed = False
) - je les avais comme True
avant mais semble qu'il a été inversé.
supprimer cette ligne (par défaut à True) et puis lancer makemigrations
immédiatement fait un module de migration et maintenant il fonctionne. makemigrations
ne fonctionnera pas sur des tables non gérées (ce qui est évident dans avec le recul)
ma solution n'était pas couverte ici donc je l'affiche. J'avais utilisé syncdb
pour un projet–juste pour le faire fonctionner. Puis quand j'ai essayé de commencer à utiliser Django migrations, il a simulé au début puis dirait que C'était "OK", mais rien ne se passait à la base de données.
ma solution était de simplement supprimer tous les fichiers de migration pour mon application, ainsi que comme les enregistrements de base de données pour les migrations de l'application dans la table django_migrations
.
alors je viens de faire une migration initiale avec:
./manage.py makemigrations my_app
suivi de:
./manage.py migrate my_app
maintenant je peux faire des migrations sans problème.
cela peut arriver pour les raisons suivantes:
- Vous n'avez pas ajouter l'application dans
INSTALLED_APPS
listesettings.py
(Vous devez ajouter soit le nom d'application ou le chemin en pointillés à la sous-classe de AppConfig en apps.py dans le dossier app, en fonction de la version de django que vous utilisez). Référence de la documentation: INSTALLED_APPS - vous n'avez pas
migrations
dossier à l'intérieur de ces applications. (Solution: il suffit de créer ce dossier). - vous n'avez pas
__init__.py
fichier à l'intérieurmigrations
dossier de ces applications. (Solution: il suffit de créer un fichier vide avec le nom _ _ init__.py ) - vous n'avez pas de fichier
__init__.py
à l'intérieur de l'application dossier. (Solution: il suffit de créer un fichier vide avec le nom _ _ init__.py ) - Vous n'avez pas de
models.py
fichier dans l'application - votre classe Python (supposée être un modèle) dans
models.py
n'hérite pasdjango.db.models.Model
- vous avez une erreur sémantique dans la définition des modèles dans
models.py
Note:
Une erreur courante est d'ajouter migrations
dans le dossier .gitignore
. Lorsque les fichiers migrations
et/ou __init__.py
sont clonés à partir d'un fichier repo distant, ils sont absents du fichier repo local. Cela cause problème.
je suggère d'ignorer les fichiers de migration en ajoutant les lignes suivantes à .gitignore
fichier
*/migrations/*
!*/migrations/__init__.py
D'accord avec @furins. Si tout semble être en ordre et pourtant ce problème se pose, Vérifiez s'il y a une méthode de propriété avec le même titre que l'attribut que vous essayez d'ajouter dans la classe Model.
- supprimer la méthode avec un nom similaire à l'attribut que vous ajoutez.
- manage.py migrations de masse 151940920"
- manage.py migrer my_app
- ajouter les méthodes.
c'est un peu une erreur stupide à faire, mais avoir une virgule supplémentaire à la fin de la ligne de déclaration de champ dans la classe de modèle, rend la ligne sans effet.
il arrive quand vous copiez coller le def. de la migration, qui elle-même est définie comme un tableau.
Mais peut-être que ce serait aider quelqu'un :-)
, La réponse est sur ce stackoverflow post, par cdvv7788 les Migrations dans Django 1.7
si c'est la première fois que vous migrez cette application, vous devez utiliser:
manage.py makemigrations myappname une fois que vous faites que vous pouvez faire:
manage.py migrer si vous aviez votre application dans la base de données, modifié son modèle et il ne met pas à jour les changements sur makemigrations vous probablement havent migré il encore. Changez votre modèle de nouveau à sa forme originale, exécutez le première commande (avec le nom de l'application) et de migrer..., il sera faux. Lorsque vous faites cela remettre les changements sur votre modèle, exécuter makemigrations et migrer à nouveau et ça devrait marcher.
j'avais exactement le même problème et faire ce qui précède fonctionnait parfaitement.
j'avais déplacé mon application django vers cloud9 et pour une raison quelconque je n'ai jamais capté la migration initiale.
peut-être que ça aidera quelqu'un. J'utilisais une application imbriquée. projet.appname et moi avions en fait projet et projet.appname in INSTALLED_APPS. La suppression du projet de INSTALLED_APPS a permis de détecter les changements.
les gens comme moi qui n'aiment pas les migrations peuvent utiliser les étapes ci-dessous.
- Supprimer les modifications que vous souhaitez synchroniser.
- Exécuter
python manage.py makemigrations app_label
pour la migration initiale. - Exécuter
python manage.py migrate
pour la création des tables avant d'apporter des modifications. - coller les modifications que vous retirez à la première étape.
- course 2. et 3. étape.
si vous avez confondu ces étapes, lire les fichiers de migration. Modifiez-les pour corriger votre schéma ou supprimer les fichiers indésirables, mais n'oubliez pas de modifier la partie dépendances du fichier de migration suivant;)
j'espère que cela aidera quelqu'un à l'avenir.
après a travaillé pour moi:
- ajouter le nom de l'application settings.py
- use ' python manage.py migrations
- utiliser "python manage.py migrer'
travaillé pour moi: Python 3.4, Django 1.10
peut-être que je suis en retard mais avez-vous essayé d'avoir un dossier migrations
dans votre application avec un fichier __init__.py
?
vous souhaitez vérifier le settings.py
dans la liste INSTALLED_APPS
et assurez-vous que toutes les applications avec des modèles sont énumérés dans il.
exécuter makemigrations
dans le dossier du projet signifie qu'il cherchera à mettre à jour toutes les tables liées à toutes les applications incluses dans settings.py
pour le projet. Une fois que vous l'incluez, makemigrations
incluera automatiquement l'application (cela économise beaucoup de travail pour que vous n'ayez pas à lancer makemigrations app_name
pour chaque application de votre projet/site).
juste au cas où vous avez un champ spécifique qui ne s'identifie pas par makemigrations: cochez deux fois si vous avez une propriété avec le même nom.
exemple:
field = django.db.models.CharField(max_length=10, default = '', blank=True, null=True)
# ... later
@property
def field(self):
pass
la propriété "écrasera" la définition du champ afin que les changements ne soient pas identifiés par makemigrations
ajoutant cette réponse parce que seule cette méthode m'a aidé.
j'ai supprimé le migrations
"151990920 dossier" exécuter makemigrations
et migrate
.
Il dit toujours: pas de migrations à appliquer.
je suis allé dans le dossier migrate
et j'ai ouvert le dernier fichier créé,
commentaire de la migration je voulais(Il a été détecté et est entré il)
et encore migrate
.
ceci édite essentiellement le fichier migrations manuellement.
ne faites ceci que si vous comprenez le contenu du fichier.
assurez-vous que votre modèle n'est pas abstract
. J'ai fait cette erreur et ça a pris du temps, alors j'ai pensé la poster.
est-ce que vous avez utilisé schemamigration my_app --initial
après avoir renommé l'ancien dossier de migration? Essayer. Pourrait fonctionner. Si ce n'est pas le cas, essayez de recréer la base de données et de faire migrer syncdb+. Il a travaillé pour moi...
j'ai eu le même problème avec avoir à exécuter makemigrations deux fois et toutes sortes de comportement étrange. Il s'est avéré que la racine du problème était que j'utilisais une fonction pour fixer des dates par défaut dans Mes modèles donc les migrations détectaient un changement à chaque fois que j'lançais des migrations de makemigrations. La réponse à cette question m'a mis sur la bonne voie: éviter les migrations de makemigrations pour recréer le champ date
J'ai récemment mis à jour Django de 1,6 à 1,8 et j'ai eu peu d'applications et de migrations pour eux. J'ai utilisé le Sud et schemamigrations
pour créer des migrations dans Django 1.6, qui est tombé dans Django 1.8.
lorsque j'ai ajouté de nouveaux modèles après la mise à niveau, la commande makemigrations
ne détectait aucun changement. Et puis j'ai essayé la solution suggérée par @drojf (1ère réponse), ça a bien fonctionné, mais pas réussi à appliquer une fausse migration initiale ( python manage.py --fake-initial
). Je faisais ceci comme mes tables (Vieux les tables) ont déjà été créés.
enfin cela a fonctionné pour moi, a supprimé les nouveaux modèles (ou les changements de modèle) de models.py et puis il a fallu supprimer (ou renommer pour la sauvegarde de sécurité) le dossier de migration de toutes les applications et exécuter python manage.py
makemigrations pour toutes les applications, puis a fait python manage.py migrate --fake-initial
. Cela a fonctionné comme un charme. Une fois que la migration initiale est créée pour toutes les applications et faux initiale migré, puis ajouté de nouveaux modèles et suivi le processus régulier de makemigrations
et de migrer sur cette application. Les changements ont été détectés et tout s'est bien passé.
j'ai juste pensé le partager ici, si quelqu'un fait face au même problème (ayant schemamigrations
du Sud pour leurs applications), il pourrait les aider:)
Peut-être que peut aider quelqu'un, j'ai eu le même problème.
j'ai déjà créé deux tables avec la classe serializer et les vues. Donc quand j'ai voulu mettre à jour, j'ai eu cette erreur.
j'ai suivi ces étapes:
- j'ai fait
.\manage.py makemigrations app
- j'ai exécuté
.\manage.py migrate
- j'ai effacé les deux tableaux de mon
models.py
- j'ai tout effacé référence à mes tables de serializer et view class.
- j'ai exécuté l'étape
1
et2
. - j'ai récupéré mes modifications juste dans le
models.py
- j'ai de nouveau effectué l'étape
5
. - j'ai restauré tous mes changements.
Si vous travaillez avec Pycharm, l'histoire locale est très utile.
peut-être que ça aidera quelqu'un.
j'ai supprimé mon models.py
et je m'attendais à ce que makemigrations
crée des déclarations DeleteModel
.
N'oubliez pas de supprimer les fichiers *.pyc
!
./manage makemigrations
./manage migrate
Migrations suivre les changements à la base de données ainsi si vous êtes en train de passer de non géré à géré, vous aurez besoin de vous assurer que votre table de base de données est à jour en ce qui concerne le modèle que vous traitez.
si vous êtes toujours en mode dev, j'ai personnellement décidé de supprimer les fichiers de migration dans mon IDE ainsi que dans la table django_migrations relative à mon modèle et de relancer la commande ci-dessus.
rappelez-vous: si vous avez une migration qui se termine avec _001 dans votre IDE et _003 dans votre base de données. Django ne verra que si vous avez une migration se terminant par _004 pour quelque chose à mettre à jour.
les migrations 2 (code & db) sont liées et fonctionnent en tandem.
Heureux de codage.
a ajouté cette réponse parce qu'aucune des autres réponses disponibles ci-dessus ne fonctionnait pour moi.
dans mon cas quelque chose d'encore plus étrange se passait ( Django 1.7 Version ), dans mon models.py j'avais une ligne " extra à la fin de mon fichier (c'était une ligne vide) et quand j'ai exécuté la commande python manage.py makemigrations
le résultat était: "aucun changement détecté".
pour corriger ce I supprimé cette "ligne blanche " qui était à la fin de mon models.py fichier et j'ai lancé la commande à nouveau, tout a été corrigé et tous les changements apportés à models.py ont été détectés!
ajoutant mon 2c, puisqu'aucune de ces solutions n'a fonctionné pour moi, mais cela a fonctionné...
je venais juste d'exécuter manage.py squashmigrations
et de supprimer les anciennes migrations (à la fois les fichiers et les lignes dans le django.les migrations de la table de base de données).
cela a laissé une ligne comme celle-ci dans le dernier fichier de migration:
replaces = [(b'my_app', '0006_auto_20170713_1735'), (b'my_app', '0007_auto_20170713_2003'), (b'my_app', '0008_auto_20170713_2004')]
ce Django apparemment confus et causé un comportement étrange: courir manage.py makemigrations my_app
recréerait la migration initiale comme si il n'en existait pas. La suppression de la ligne replaces...
a réglé le problème!