web-dev-qa-db-fra.com

Django La colonne d'erreur de programmation n'existe pas même après l'exécution des migrations

Je cours python manage.py makemigrations et j'obtiens: Aucun changement détecté Ensuite, python manage.py migrate et j'obtiens: Aucune migration à appliquer.

Ensuite, j'essaie de pousser les modifications à la production: git Push heroku master Tout à jour

Puis, en production, je répète la commande: heroku run python manage.py migrate Aucune migration à appliquer.

Au cas où, je lance makemigrations en production:

heroku run python manage.py makemigrations
No changes detected

POURQUOI alors j'obtiens un

ProgrammingError at ....

column .... does not exist

"Aucun changement détecté" signifie que la base de données est cohérente avec le code. Comment puis-je déboguer cela? ¡?

12

Les migrations Django sont enregistrées dans votre base de données sous la table 'Django_migrations'. C'est ainsi que Django sait quelles migrations ont été appliquées et lesquelles doivent encore être appliquées.

Jetez un œil à la table Django_migrations dans votre base de données. Il se peut que quelque chose se soit mal passé lors de l'application de votre migration. Supprimez donc la ligne du tableau dont le nom du fichier de migration est lié à cette colonne qui "n'existe pas". Ensuite, essayez de relancer une migration.

8
zubhav

J'ai le même problème (la colonne n'existe pas) mais quand j'essaye d'exécuter migrate pas avec makemigrations (c'est le même problème je crois)

  • Cause: j'ai supprimé les fichiers de migration et les ai remplacés par un seul fichier de migration initiale semblant 0001 avant d'exécuter la migration pour la dernière modification

  • Solution:

    1. Supprimez les tables impliquées dans cette migration de cette application (envisagez une solution de contournement, le cas échéant)
    2. Supprimez les lignes responsables de la migration de cette application de la table Django_migrations dans lequel les migrations sont enregistrées, Voici comment Django sait quelles migrations ont été appliquées et lesquelles doivent encore être appliquées.

Et voici comment résoudre ce problème:

  • connectez-vous en tant qu'utilisateur postgres (mon utilisateur s'appelle posgres):

    Sudo -i -u postgres

  • Ouvrez un terminal SQL et connectez-vous à votre base de données:

    psql -d database_name

  • Lister votre table et repérer les tables liées à cette application:

    \dt

  • Déposez-les (considérez l'ordre de chute avec les relations):

    DROP TABLE tablename ;

  • Liste des enregistrements de migration, vous verrez les migrations appliquées classées comme suit:

id | app | nom | appliqué
- + ------ + -------- + --------- +

SELECT * FROM Django_migrations;
  • Supprimez des lignes de migrations de cette application (vous pouvez supprimer par identifiant ou par application, avec l'application n'oubliez pas les "guillemets"):

    DELETE FROM Django_migrations WHERE app='yourapp';

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

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

Remarque: il est possible que dans votre cas, vous n'ayez pas à supprimer toutes les tables de cette application et pas toutes les migrations, uniquement celles des modèles à l'origine du problème.

Je souhaite que cela puisse aider.

11
Yahya Yahyaoui

J'ai eu un problème similaire - le message d'erreur est apparu lorsque j'ai cliqué sur le modèle sur le site Django-admin. Je l'ai résolu en commentant le champ dans models.py, puis en exécutant les migrations. Après cela, j'ai commenté le champ et relancé les migrations. Après cela, le message d'erreur a disparu.

3
GraceBe

Donc, je rencontre toujours ce genre de problème, donc aujourd'hui j'ai décidé d'essayer de le résoudre au niveau de la base de données. Le fait est que j'ai changé un nom de champ de modèle qui Django n'a pas pris la peine de se refléter dans un fichier de migration. Je ne l'ai découvert que plus tard lorsque j'ai rencontré des problèmes. Plus tard, j'ai regardé les fichiers de migration et découvert qu'il n'y avait pas de migration pour ce changement. Mais je ne l'ai pas remarqué car j'ai aussi fait d'autres changements, donc une fois que j'ai vu un fichier de migration, j'étais content. Mon conseil. Créez une migration pour chaque modification une par une. De cette façon, vous pouvez voir si cela s'est produit ou non.

Voici donc mon travail à travers elle dans MySQL.

ouvrez la console mysql.

show databases; # see all my dbs. I deleted a few
drop database <db-name>; # if needed
use <db-name>; # the database name for your Django project
show tables; # see all tables in the database
DESCRIBE <table-name>; # shows columns in the database
SHOW COLUMNS FROM <db-name>; # same thing as above
ALTER TABLE <table-name> CHANGE <old-column-name> <new-column-name> <col-type>; # now I manually updated my column name

Si vous utilisez postgresql, recherchez simplement les commandes correspondantes sur Google.

0
chidimo