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? ¡?
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.
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:
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 ;
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.
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.
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.