Wie der Titel schon sagt, kann ich Migrationen scheinbar nicht zum Laufen bringen.
Die App war ursprünglich unter 1.6, daher verstehe ich, dass Migrationen anfangs nicht vorhanden sind. Wenn ich sie ausführe, python manage.py migrate
bekomme ich:
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.
Wenn ich Änderungen an einem Modell in myapp
vornehme, heißt es immer noch, wie erwartet, nicht migriert.
Aber wenn ich renne, python manage.py makemigrations myapp
bekomme ich:
No changes detected in app 'myapp'
Es scheint nicht wichtig zu sein, was oder wie ich den Befehl ausführe, es erkennt niemals, dass die App Änderungen aufweist, und es werden auch keine Migrationsdateien zur App hinzugefügt.
Gibt es eine Möglichkeit, eine App für Migrationen zu erzwingen und im Wesentlichen zu sagen, dass dies meine Basis ist, mit der ich arbeiten kann, oder so? Oder fehlt mir etwas?
Meine Datenbank ist eine PostgreSQL-Datenbank, wenn das überhaupt hilft.
quelle
Antworten:
Wenn Sie von einer vorhandenen App wechseln, die Sie in Django 1.6 erstellt haben, müssen Sie einen in der Dokumentation aufgeführten Vorschritt (wie ich herausgefunden habe) ausführen:
Die Dokumentation macht nicht deutlich, dass Sie dem Befehl die App-Bezeichnung hinzufügen müssen, da Sie als Erstes aufgefordert werden,
python manage.py makemigrations
das zu tun, was fehlschlägt. Die anfängliche Migration erfolgt, wenn Sie Ihre App in Version 1.7 erstellen. Wenn Sie jedoch aus 1.6 stammen, wurde sie nicht ausgeführt. Siehe die ‚Hinzufügen von Migration auf Apps‘ in der Dokumentation für weitere Details.quelle
python manage.py makemigrations APP_LABEL
für jeden müssen?./manage.py startapp
, aber ich musste noch explizit das Label erwähnenDies kann folgende Gründe haben:
INSTALLED_APPS
Liste in nicht hinzugefügtsettings.py
(Sie müssen entweder den App-Namen oder den gepunkteten Pfad zur Unterklasse von AppConfig in apps.py im App-Ordner hinzufügen, abhängig von der verwendeten Django-Version). Siehe Dokumentation: INSTALLED_APPSmigrations
Ordner in diesen Apps. (Lösung: Erstellen Sie einfach diesen Ordner).__init__.py
Datei immigrations
Ordner dieser Apps. (Lösung: Erstellen Sie einfach eine leere Datei mit dem Namen __init__.py )__init__.py
Datei im App-Ordner. (Lösung: Erstellen Sie einfach eine leere Datei mit dem Namen __init__.py )models.py
Datei in der Appmodels.py
erbt nichtdjango.db.models.Model
models.py
Hinweis: Ein häufiger Fehler ist das Hinzufügen eines
migrations
Ordners zur.gitignore
Datei. Beim Klonen aus dem Remote-Repo fehlenmigrations
Ordner und / oder__init__.py
Dateien im lokalen Repo. Dies verursacht ein Problem.Ich schlage vor, Migrationsdateien durch Hinzufügen der folgenden Zeilen zur
.gitignore
Datei zu gitignorequelle
__init__.py
Ordner zusammen mit den Migrationen gelöscht .You don't have __init__.py file inside migrations folder of those apps. (Solution: Just create an empty file with name __init__.py)
und es wurde durch Hinzufügen der Dateien zu.gitignore
__init__.py
Datei ist in einem Verzeichnis erforderlich, damit sie als Python-Paket behandelt wird. siehe diesOk, es sieht so aus, als hätte ich einen offensichtlichen Schritt verpasst, aber dies zu posten, falls jemand anderes das Gleiche tut.
Beim Upgrade auf 1.7 wurden meine Modelle nicht mehr verwaltet (
managed = False
) - ich hatte sie wieTrue
zuvor, aber es scheint, dass sie zurückgesetzt wurden.Durch Entfernen dieser Zeile (standardmäßig True) und
makemigrations
sofortiges Ausführen wurde ein Migrationsmodul erstellt, und jetzt funktioniert es.makemigrations
funktioniert nicht bei nicht verwalteten Tabellen (was im Nachhinein offensichtlich ist)quelle
manage.py inspectdb
manage = False! Wenn Sie ältere Datenbanken importieren, müssen Sie diese sorgfältig optimieren!app_label
Meine Lösung wurde hier nicht behandelt, daher poste ich sie. Ich hatte es
syncdb
für ein Projekt verwendet - nur um es zum Laufen zu bringen. Als ich dann versuchte, Django-Migrationen zu verwenden, fälschte es sie zuerst und sagte dann, es sei "OK", aber mit der Datenbank passierte nichts.Meine Lösung bestand darin, einfach alle Migrationsdateien für meine App sowie die Datenbankeinträge für die App-Migrationen in der
django_migrations
Tabelle zu löschen .Dann habe ich gerade eine erste Migration durchgeführt mit:
./manage.py makemigrations my_app
gefolgt von:
./manage.py migrate my_app
Jetzt kann ich problemlos Migrationen durchführen.
quelle
__init.py__
, es wird nicht funktionieren.Stimmen Sie mit @furins überein. Wenn alles in Ordnung zu sein scheint und dieses Problem dennoch auftritt, überprüfen Sie, ob es eine Eigenschaftsmethode mit demselben Titel wie das Attribut gibt, das Sie der Model-Klasse hinzufügen möchten.
quelle
Dies ist ein dummer Fehler, aber ein zusätzliches Komma am Ende der Felddeklarationszeile in der Modellklasse hat keine Auswirkung auf die Zeile.
Es passiert, wenn Sie kopieren und die def einfügen. aus der Migration, die selbst als Array definiert ist.
Obwohl das vielleicht jemandem helfen würde :-)
quelle
Vielleicht bin ich zu spät, aber haben Sie versucht, einen
migrations
Ordner mit einer__init__.py
Datei in Ihrer App zu haben ?quelle
Vielleicht hilft das jemandem. Ich habe eine verschachtelte App verwendet. project.appname und ich hatten tatsächlich project und project.appname in INSTALLED_APPS. Durch das Entfernen des Projekts aus INSTALLED_APPS konnten die Änderungen erkannt werden.
quelle
Die Antwort finden Sie in diesem Stackoverflow-Beitrag von cdvv7788 Migrations in Django 1.7
Ich hatte genau die gleichen Probleme und das oben genannte funktionierte perfekt.
Ich hatte meine Django-App auf Cloud9 verschoben und aus irgendeinem Grund die anfängliche Migration nie mitbekommen.
quelle
Folgendes hat bei mir funktioniert:
Arbeitete für mich: Python 3.4, Django 1.10
quelle
Leute wie ich, die keine Migrationen mögen, können die folgenden Schritte ausführen.
python manage.py makemigrations app_label
für die erste Migration.python manage.py migrate
aus, um Tabellen zu erstellen, bevor Sie Änderungen vornehmen.Wenn Sie einen dieser Schritte verwechselt haben, lesen Sie die Migrationsdateien. Ändern Sie sie, um Ihr Schema zu korrigieren oder unerwünschte Dateien zu entfernen, aber vergessen Sie nicht, den Abhängigkeitsteil der nächsten Migrationsdatei zu ändern;)
Ich hoffe, dass dies in Zukunft jemandem helfen wird.
quelle
Sie möchten das
settings.py
in derINSTALLED_APPS
Liste überprüfen und sicherstellen, dass alle Apps mit Modellen dort aufgelistet sind.Wenn Sie
makemigrations
im Projektordner ausgeführt werden, werden alle Tabellen aktualisiert, die sich auf allesettings.py
für das Projekt enthaltenen Apps beziehen . Sobald Sie es hinzugefügt haben,makemigrations
wird die App automatisch eingeschlossen (dies spart viel Arbeit, sodass Sie nichtmakemigrations app_name
für jede App in Ihrem Projekt / Ihrer Site ausgeführt werden müssen).quelle
Nur für den Fall, dass Sie ein bestimmtes Feld haben, das nicht durch Makemigrationen identifiziert wird: Überprüfen Sie zweimal, ob Sie eine Eigenschaft mit demselben Namen haben.
Beispiel:
Die Eigenschaft "überschreibt" die Felddefinition, sodass Änderungen nicht durch identifiziert werden
makemigrations
quelle
hourly_rate = models.DecimalField
(das nachfolgende '()' fehlt) und es ist einfach lautlos fehlgeschlagen.Stellen Sie sicher, dass Ihr Modell nicht ist
abstract
. Ich habe diesen Fehler tatsächlich gemacht und es hat eine Weile gedauert, also dachte ich, ich würde ihn posten.quelle
Diese Antwort hinzufügen, weil mir nur diese Methode geholfen hat.
Ich habe den
migrations
Ordner runmakemigrations
und gelöschtmigrate
.Es hieß immer noch: Keine Migrationen zu beantragen.
Ich ging zum
migrate
Ordner und öffnete die zuletzt erstellte Datei,kommentierte die gewünschte Migration (sie wurde erkannt und dort eingegeben)
und führte sie
migrate
erneut aus.Dadurch wird die Migrationsdatei grundsätzlich manuell bearbeitet.
Tun Sie dies nur, wenn Sie den Dateiinhalt verstehen.
quelle
Haben Sie
schemamigration my_app --initial
nach dem Umbenennen des alten Migrationsordners verwendet? Versuch es. Könnte funktionieren. Wenn nicht, versuchen Sie, die Datenbank neu zu erstellen und syncdb + migrieren zu lassen. Es hat bei mir funktioniert ...quelle
schemamigration
gibt keinen Befehl - ich denke, das ist ein Teil des Südens? Ich habe derzeit überhaupt keinen Migrationsordner. Das Entfernenmodels.py
und erneutes Ausführeninspectdb
schien nichts zu bewirken .schemamigration
war aus dem Süden.makemigrations
ist sein Ersatz.makemigrations --empty
Hatte das gleiche Problem Stellen Sie sicher, dass alle Klassen, die Sie in models.py definiert haben, die Datei models.Model erben müssen.
quelle
Ich hatte das gleiche Problem damit, zweimal Auswanderungen durchführen zu müssen und alle möglichen seltsamen Verhaltensweisen. Es stellte sich heraus, dass die Ursache des Problems darin bestand, dass ich eine Funktion zum Festlegen von Standarddaten in meinen Modellen verwendete, sodass Migrationen bei jeder Ausführung von Makemigrationen eine Änderung feststellten. Die Antwort auf diese Frage hat mich auf den richtigen Weg gebracht: Vermeiden Sie Auswanderungen, um das Datumsfeld neu zu erstellen
quelle
Ich habe kürzlich Django von 1.6 auf 1.8 aktualisiert und hatte nur wenige Apps und Migrationen für sie. Ich habe den Süden verwendet und
schemamigrations
Migrationen in Django 1.6 erstellt, das in Django 1.8 gelöscht wird.Als ich nach dem Upgrade neue Modelle hinzufügte,
makemigrations
erkannte der Befehl keine Änderungen. Und dann habe ich die von @drojf vorgeschlagene Lösung ausprobiert (1. Antwort), sie hat gut funktioniert, aber keine gefälschte anfängliche Migration angewendet (python manage.py --fake-initial
). Ich habe dies getan, da meine Tabellen (alte Tabellen) bereits erstellt wurden.Schließlich funktionierte dies für mich, entfernte neue Modelle (oder Modelländerungen) aus models.py und musste dann den Migrationsordner aller Apps löschen (oder zur Sicherheitssicherung umbenennen) und Python-
manage.py
Makemigrationen für alle Apps ausführenpython manage.py migrate --fake-initial
. Das hat wie ein Zauber gewirkt. Sobald die anfängliche Migration für alle Apps erstellt und die gefälschte anfängliche Migration durchgeführt wurde, wurden neue Modelle hinzugefügt und der reguläre Prozessmakemigrations
und die Migration dieser App befolgt . Die Änderungen wurden jetzt erkannt und alles ging gut.Ich habe gerade daran gedacht, es hier zu teilen. Wenn jemand das gleiche Problem hat (
schemamigrations
von Süden für seine Apps), könnte es ihm helfen :)quelle
Vielleicht kann das jemandem helfen, ich hatte das gleiche Problem.
Ich habe bereits zwei Tabellen mit der Serializer-Klasse und den Ansichten erstellt. Als ich also aktualisieren wollte, hatte ich diesen Fehler.
Ich habe diese Schritte befolgt:
.\manage.py makemigrations app
.\manage.py migrate
models.py
1
und ausgeführt2
.models.py
5
.Wenn Sie mit Pycharm arbeiten, ist die lokale Geschichte sehr hilfreich.
quelle
Vielleicht hilft das jemandem.
Ich habe meine gelöscht
models.py
und erwartetmakemigrations
,DeleteModel
Anweisungen zu erstellen .Denken Sie daran,
*.pyc
Dateien zu löschen !quelle
Migrationen verfolgen Änderungen an der Datenbank. Wenn Sie also von nicht verwaltet zu verwaltet wechseln, müssen Sie sicherstellen, dass Ihre Datenbanktabelle in Bezug auf das Modell, mit dem Sie sich befassen, auf dem neuesten Stand ist.
Wenn Sie sich noch im Entwicklungsmodus befinden, habe ich persönlich beschlossen, die Migrationsdateien in meiner IDE sowie in der Tabelle django_migrations zu meinem Modell zu löschen und den obigen Befehl erneut auszuführen.
ERINNERN SIE SICH: Wenn Sie eine Migration haben, die mit _001 in Ihrer IDE und _003 in Ihrer Datenbank endet. Django wird nur sehen, ob eine Migration mit _004 endet, damit etwas aktualisiert werden kann.
Die 2 (Code & DB-Migrationen) sind verknüpft und arbeiten zusammen.
Viel Spaß beim Codieren.
quelle
quelle
Diese Antwort wurde hinzugefügt, da keine der oben verfügbaren Antworten für mich funktioniert hat.
In meinem Fall passierte etwas noch Seltsameres ( Django 1.7 Version ). In meiner models.py hatte ich eine "zusätzliche" Zeile am Ende meiner Datei (es war eine leere Zeile) und als ich den
python manage.py makemigrations
Befehl ausführte, war das Ergebnis: "Keine Änderungen erkannt".Um dies zu beheben, habe ich diese "leere Zeile" gelöscht , die sich am Ende meiner Datei models.py befand , und den Befehl erneut ausgeführt. Alles wurde behoben und alle an models.py vorgenommenen Änderungen wurden erkannt!
quelle
Möglicherweise müssen Sie die ersten Migrationen mit dem folgenden Befehl vortäuschen
quelle
Erstens ist diese Lösung auf diejenigen anwendbar, bei denen während der Bereitstellung auf dem Heroku-Server dasselbe Problem auftritt. Ich hatte dasselbe Problem.
Für die Bereitstellung ist ein obligatorischer Schritt erforderlich: Hinzufügen von django_heroku.settings (local ()) in der Datei settings.py.
Änderungen: Als ich die obige Zeile in django_heroku.settings (local (), database = False) geändert habe, hat es einwandfrei funktioniert.
quelle
In meinem Fall musste ich mein Modell zur Datei _ init _.py des Modellordners hinzufügen, in dem mein Modell definiert wurde:
quelle
Hinzufügen meiner 2c, da keine dieser Lösungen für mich funktionierte, aber dies tat ...
Ich hatte gerade
manage.py squashmigrations
die alten Migrationen ausgeführt und entfernt (sowohl die Dateien als auch die Zeilen in der Datenbanktabelle django.migrations).Dies hat in der letzten Migrationsdatei eine Zeile wie diese hinterlassen:
Dies verwirrte Django anscheinend und verursachte seltsames Verhalten: Durch Ausführen wurde
manage.py makemigrations my_app
die anfängliche Migration neu erstellt, als ob keine vorhanden wäre. Das Entfernen derreplaces...
Leitung hat das Problem behoben!quelle
python manage.py makemigrations-Konten Migrationen für 'Konten': Konten \ Migrationen \ 0001_initial.py - Modell erstellen Kunde - Modell erstellen Tag - Modell erstellen Produkt - Modell erstellen Bestellung
Hinweis: Hier ist "Konten" mein App-Name
quelle