Django Migration Fehler: Spalte nicht vorhanden ist
Python 3, Django 1.8.5, Postgres
Habe ich ein Modell Sites
worden, dass hat gut funktioniert. Ich habe vor kurzem versucht, um ein Feld hinzuzufügen, airport_code, und migrieren Sie die Daten.
class Site(BaseModel):
objects = SiteManager()
name = models.CharField(max_length=200, unique=True)
domain = models.CharField(max_length=200, unique=True)
weather = models.CharField(max_length=10)
nearby_sites = models.ManyToManyField('self', symmetrical=False, blank=True)
users = models.ManyToManyField(settings.AUTH_USER_MODEL, blank=True)
facebook = models.URLField(max_length=200)
twitter = models.URLField(max_length=200)
header_override = models.TextField(blank=True)
email_header_override = models.TextField(blank=True)
timely_site_tag_id = models.IntegerField()
timely_featured_tag_id = models.IntegerField()
timely_domain = models.CharField(max_length=255)
sitemap_public_id = models.CharField(max_length=255)
state = models.CharField(max_length=24)
airport_code = JSONField()
Allerdings, wenn ich lief makemigrations
ich bekam eine Fehlermeldung:
django.db.utils.ProgrammingError: column sites_site.airport_code does not exist
LINE 1: ..._site"."sitemap_public_id", "sites_site"."state", "sites_sit...
Natürlich ist dies nicht sinnvoll, weil die Spalte offensichtlich nicht vorhanden, wenn ich versuche, um es zu schaffen innerhalb der migration.
Ich habe gesehen, viele Fragen über diesen Fehler auf Stack Overflow, die unbeantwortet geblieben sind, oder haben Sie eine Lösung erstellen Sie manuell die migration-Datei, oder zu zerstören, und erstellen Sie die Datenbank neu. Dies ist nicht eine OK-Lösung.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nachdem Sie laufen makemigrations, sicher sein, zu gehen durch die stack-trace-Schritt für Schritt.
In meinem Fall, bemerkte ich, es verfolgt durch einen Aufruf einer Form, die in einem forms.py in eine völlig andere app, die einen Aufruf zu dem Modell, ich habe versucht, erstellen Sie eine neue migration.
Verschieben der Form-Klasse aus forms.py in der views.py wurde das Problem behoben.
Dieser Fehler wurde behoben, für mich durch auskommentieren die django-debug-toolbar von INSTALLED_APPS in settings.py. Ich bin nicht sicher, warum die debug-toolbar ist der übeltäter, aber nachdem ich bemerkte es, ich war in der Lage zu laufen
makemigrations
undmigrate
mit kein Problem.Hoffe, dies hilft jemand, wie ich verbrachte zwölf Stunden zu versuchen, es herauszufinden.
In meinem Fall war denn ich hatte eine unique_together Einschränkung festgelegt wurde.
Wenn ich wollte, um ein Feld zu entfernen, die automatisch generierte migration versucht zu entfernen, den Bereich vor dem entfernen der unique_together Einschränkung.
Was ich zu tun hatte war manuell verschieben, bis die Migrationen.AlterUniqueTogether Einschränkung in der migration-Datei, so dass django entfernt zunächst die Einschränkung, bevor Sie versuchen, entfernen das Feld.
Ich hoffe, dies kann jemand helfen.
Ich lief in dieses Problem und die Antwort von @Nexus geholfen. Ich dachte, ich würde die Einzelheiten von meinen speziellen Fall hier zur besseren Veranschaulichung der Ursache des Problems. Wie es scheint, einen möglichen Fehler zu mir.
Habe ich ein Modell
Brand
wie folgt:Ich lief eine
python manage.py makemigrations
nach dem hinzufügen einesBoolean
Feld wie folgt:Beim ausführen des
makemigrations
Befehl, erhielt ich eine Fehlermeldung wie OP ' s:Pro @Nexus' Vorschlag, ich ging durch die stacktrace -, line-by-line, unter der Annahme, dass es sich nicht um ein core-Problem mit Django. Wie es sich herausstellt, in einer der apps
forms.py
Datei hatte ich folgende:War die Lösung, einfach kommentieren, die Zeile ausführen
manage.py makemigrations
, dann laufenmanage.py migrate
. Danach habe ich die Zeile auskommentiert und alles und meine Formulare " - Funktionalität gearbeitet wie zuvor.all()
Methode. Ich habe fast genau das gleiche problem, aber mein stacktrace zeigt ein Versagen anModel.objects.all()
. Ich bin nicht mit dieser Abfrage in meineforms.py
- das war in meinem migration-Datei als eine Funktion Hinzugefügt.name__in
arbeiten nicht auf diesem Feld.Ich hab das gleiche problem (Spalte nicht vorhanden), aber wenn ich versuche zu laufen
migrate
nicht mitmakemigrations
Ursache: ich entfernte die migration von Dateien und ersetzt Sie mit dem einzelnen vorgibt intial-migration-Datei 0001 vor der Ausführung der migration für die Letzte änderung
Lösung:
django_migrations
in denen Migrationen aufgezeichnet werden, Dies ist, wie Django kennt die Migrationen angewendet wurden und welche noch angewendet werden müssen.Und hier ist, wie dieses problem zu lösen:
melden Sie sich als postgres-user (mein Benutzer heißt posgres):
sudo -i -u postgres
Öffnen Sie eine sql-terminal und eine Verbindung zu Ihrer Datenbank:
psql -d database_name
Liste zu Ihrem Tisch und Stelle die Tabellen miteinander in Beziehung zu dieser app:
\dt
Legen Sie Sie (denken Sie drop, um mit Beziehungen):
DROP TABLE tablename ;
Zeilen löschen von Migrationen, die app (Sie können das löschen von id oder eine app, mit app-vergessen Sie nicht, 'Zitate'):
DELETE FROM django_migrations WHERE app='your_app';
melden Sie sich und führen Sie Ihre Migrationen lediglich (vielleicht makemigrations in deinem Fall):
python manage.py migrate --settings=your.settings.module_if_any
Hinweis: es ist möglich, dass in Ihrem Fall werden Sie nicht haben, um drop alle Tabellen, die app, und nicht alle Migrationen, nur diejenigen Modelle, die das problem verursacht.
Diesen möchte ich helfen kann.
Ich lief in dieses problem, vor kurzem, nach dem Upgrade auf Django 1.11. Ich wollte dauerhaft das Problem zu beheben, so wäre ich nicht zu kommentieren /kommentieren Sie code jedes mal, wenn ich lief eine migration auf dem Tisch, so ist mein Ansatz:
Benennen Sie die Ausnahme während der import um
AvoidDataMigrationError
so ist es klar, warum es da ist.Stecken in diesem Thema vor kurzem.
In meinem Fall, ich habe einen Verweis auf ein nicht vorhandenes Feld im code, dann kam ich in die Modell-Datei und fügte hinzu, das neue Feld, dann versucht zu laufen
makemigrations
Befehl, die geworfen werden, die oben genannten Fehler.Also ging ich zu den stack-trace alle der Weg nach oben und fand die neu hinzugefügte Referenz war das problem. kommentierte, dass aus, lief
makemigrations
und voila.Hatte jetzt den gleichen Fehler, wenn ich versuchte, Sie zu migrieren einer SingletonModel tatsächlich enthalten die notwendigen Felder aus.
Grund für den Fehler war, dass mein Modell Ein verwendet einige Felder, die von dieser SingletonModel (als konfigurierbare Werte). Und während instantation des Modells während der migration offensichtlich konnte nicht garantieren, dass meine migration sicher war.
Hatte ein Kollege eine wunderbare Idee. Stellen Sie den Standardwert für das Feld eine Funktion aufrufen, und daher faul.
Beispiel:
So deswegen, mein Rat:
Versuchen Sie, und machen die beanstandeten Anruf (gesehen im stacktrace) ein fauler.
Laufen in dieses problem nach der migration von meiner postgres-Datenbank auf einem einzelnen server. Irgendwie habe ich das Durcheinander der Datenbank und konnte nicht aktualisieren mein Modell mit der neuen Klasse UserProfile.
Ich das problem gelöst, erstellen erste migration für bestehende schema:
django_migrations
Tabelle:delete from django_migrations;
mit einem BefehlDELETE FROM django_migrations WHERE app='my_app';
migrations
Ordner:rm -rf <app>/migrations/
python manage.py migrate --fake
python manage.py makemigrations <app>
. Kümmern Abhängigkeiten (Modelle mit ForeignKey ' s laufen soll, die nach Ihren übergeordneten Modell).python manage.py migrate --fake-initial
Habe es hier: https://stackoverflow.com/a/29898483
PS ich bin mir nicht sicher, dass dies war relevant für die Lösung des Problems, aber, ersten, ließ ich die Tabelle in postgresql, die einen Fehler verursacht und kommentiert die UserProfile-Klasse in Modellen.
in der Schale:
models.py: