Django Migration erreur: la colonne n'existe pas

Python 3, Django 1.8.5, Postgres

j'ai un modèle Sites cela a bien fonctionné. J'ai récemment essayé d'ajouter un champ, airport_code, et de migrer les données.

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()

Cependant, lorsque j'ai couru makemigrations j'ai une erreur:

django.db.utils.ProgrammingError: column sites_site.airport_code does not exist LINE 1: ..._site"."sitemap_public_id", "sites_site"."state", "sites_sit...

bien sûr, cela n'a pas de sens, parce que la colonne n'existe évidemment pas quand j'essaie de la créer dans la migration.

j'ai vu beaucoup de questions sur ce bug sur la pile Débordement qui sont sans réponse, ou ont une solution pour créer manuellement le fichier de migration, ou détruire et reconstruire la base de données. Ce n'est pas une solution acceptable.

17
demandé sur tjati 2015-11-13 00:39:49

6 réponses

après avoir lancé makemigrations, assurez-vous de passer par la pile de trace étape par étape.

dans mon cas, j'ai remarqué qu'il remontait à travers un appel à une forme contenue dans un forms.py dans une application complètement différente, qui s'est avéré avoir un appel au modèle que j'essayais de créer une nouvelle migration pour.

déplacement de la classe de formulaires hors de forms.py dans la views.py j'ai réglé le problème.

9
répondu Nexus 2018-01-10 21:16:11

ce bug a été résolu pour moi en commentant la barre d'outils de débogage de django à partir de INSTALLED_APPS in settings.py. Je ne suis pas sûr pourquoi debug toolbar est le coupable, mais après que je l'ai commenté, j'ai pu exécuter makemigrations et migrate sans problème.

en espérant que cela aide quelqu'un, car j'ai passé douze heures à essayer de comprendre.

7
répondu Alex 2015-11-12 21:39:49

dans mon cas, c'était parce que j'avais une contrainte unique_together qui était définie.

quand j'ai voulu supprimer un champ, la migration générée automatiquement a essayé de supprimer le champ avant de supprimer la contrainte unique_together.

Ce que j'avais à faire était de déplacer manuellement les migrations.AlterUniqueTogether contrainte dans le fichier de migration, de sorte que django enlève d'abord la contrainte avant d'essayer de supprimer le champ.

j'espère que cela peut aider quelqu'un.

1
répondu darksider 2018-04-30 09:17:51

j'ai eu le même problème (colonne n'existe pas) mais quand j'essaie d'exécuter migrate pas makemigrations

  • Cause: j'ai supprimé les fichiers de migration et les ai remplacés par un simple fichier de migration fictif 0001 avant d'exécuter la migration pour le dernier changement

  • Solution:

    1. supprimer les tables impliquées dans la migration de l'application (envisager une sauvegarde solution de contournement si tout)
    2. Supprimer les lignes responsable de la migration de cette application de la table django_migrations dans lequel les migrations sont enregistrées, C'est ainsi que Django sait quelles migrations ont été appliquées et lesquelles doivent encore l'être.

Et voici comment résoudre ce problème:

  • connectez-vous en tant qu'utilisateur postgres (mon utilisateur est appelé posgres):

    sudo -i -u postgres

  • ouvrez un terminal sql et connectez - vous à votre base de données:

    psql -d database_name

  • Liste de votre table et de repérer les tableaux relatifs à l'application:

    \dt

  • Drop (pensez à déposer de l'ordre avec des liens):

    DROP TABLE tablename ;

  • Liste de migration record, vous verrez migrations appliquée classés comme suit:

id | app | nom | appliquée

--+------+--------+---------+

SELECT * FROM django_migrations;
  • Supprimer des lignes de migration de l'application (vous pouvez supprimer par id ou par application, avec l'application, n'oubliez pas des "citations"):

    DELETE FROM django_migrations WHERE app='your_app';

  • déconnectez-vous et exécutez vos migrations simplement (peut-être exécutez makemigrations dans votre cas):

    python manage.py migrate --settings=your.settings.module_if_any

Remarque: il est possible que dans votre cas, n'auront pas à déposer toutes les tables de l'application, et non tous les les migrations, juste celles des modèles à l'origine du problème.

je souhaite que cela peut vous aider.

0
répondu Yahya Yahyaoui 2018-05-30 12:05:42