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.
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.
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.
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.
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:
- supprimer les tables impliquées dans la migration de l'application (envisager une sauvegarde solution de contournement si tout)
- 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.