2015-11-12 23 views
13

Python 3, Django 1.8.5, PostgresDjango Migration Fehler: Spalte existiert nicht

Ich habe ein Modell Sites die fein gearbeitet hat. Ich habe kürzlich versucht, ein Feld, airport_code, hinzuzufügen und die Daten zu migrieren.

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 makemigrations lief bekam ich einen Fehler:

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, da die Spalte offensichtlich nicht existiert, wenn ich versuche, Erstellen Sie es innerhalb der Migration.

Ich habe viele Fragen zu diesem Fehler in Stack Overflow gesehen, die nicht beantwortet werden, oder habe eine Lösung, um die Migrationsdatei manuell zu erstellen oder die Datenbank zu zerstören und neu zu erstellen. Dies ist keine gute Lösung.

Antwort

6

Dieser Fehler wurde für mich gelöst, indem die Django-Debug-Symbolleiste aus INSTALLED_APPS in settings.py kommentiert wurde. Ich bin mir nicht sicher, warum Debug Toolbar ist der Übeltäter, aber nachdem ich es auskommentiert, konnte ich makemigrations und migrate ohne Problem ausführen.

In der Hoffnung, dass dies jemand hilft, wie ich verbrachte zwölf Stunden versuchen, es herauszufinden.

+4

Dies ist für mich passiert auch, aber leider bin ich die Django Toolbar nicht verwenden. Ich bin mir nicht sicher, wie es weitergehen soll ... –

+0

Django Toolbar funktioniert auch für mich. Meine Datenbank ist SQLite. – JimInCO

6

Nachdem Sie Makemigrationen ausgeführt haben, müssen Sie die Stapelverfolgung Schritt für Schritt durchgehen.

In meinem Fall bemerkte ich, dass es durch einen Aufruf an ein Formular in einer forms.py in einer völlig anderen App zurückverfolgt wurde, die zufällig zu dem Modell kam, für das ich eine neue Migration erstellen wollte.

Durch das Verschieben der Form-Klasse aus formas.py in die Datei views.py wurde das Problem behoben.

-1

Führen Sie dieses Problem nach der Migration meiner Postgres-Datenbank auf einen anderen Server. Irgendwie habe ich die Datenbank durcheinander gebracht und konnte mein Modell nicht mit der neuen Klasse UserProfile aktualisieren.

löste ich das Problem erste Migration für bestehendes Schema erstellen:

  1. entleeren django_migrations Tabelle: delete from django_migrations; mit einem Befehl DELETE FROM django_migrations WHERE app='my_app';
  2. Für jede App, ihre migrations Ordner löscht: rm -rf <app>/migrations/
  3. die Migrationen zurückstellen für die "eingebauten" Apps: python manage.py migrate --fake
  4. Für jede App: python manage.py makemigrations <app>. Achten Sie auf Abhängigkeiten (Modelle mit ForeignKeys sollten nach ihrem übergeordneten Modell ausgeführt werden). Schließlich
  5. : python manage.py migrate --fake-initial

Verstanden hier: https://stackoverflow.com/a/29898483

PS Ich bin nicht sicher, dass dies auf die Lösung des Problems relevant war aber zunächst, ließ ich die Tabelle in postgresql, dass ein verursacht Fehler und die UserProfile-Klasse in Modellen auskommentiert.

in der Schale:

sudo -su postgres 
psql databse_name 
DROP TABLE table_name; 

models.py:

#class UserProfile(models.Model): 
    #user = models.OneToOneField(settings.AUTH_USER_MODEL, unique=True, primary_key=True, on_delete=models.CASCADE, related_name='user_profile') 
    #avatar = ThumbnailerImageField(upload_to='profile_images', blank=True) 
    #country = models.CharField(max_length = 128) 
Verwandte Themen