Django Programming error column does not exist even after running migrations

Alejandro Veintimilla picture Alejandro Veintimilla · Mar 5, 2017 · Viewed 39k times · Source

I run python manage.py makemigrations and I get: No changes detected Then, python manage.py migrate and I get: No migrations to apply.

Then, I try to push the changes to production: git push heroku master Everything up-to-date

Then, in production, I repeat the command: heroku run python manage.py migrate No migrations to apply.

Just in case, I run makemigrations in production:

heroku run python manage.py makemigrations
No changes detected

WHY then I get a

ProgrammingError at ....

column .... does not exist

"No changes detected" means the database is coherent with the code. How can I debug this?¡?

Answer

Yahya Yahyaoui picture Yahya Yahyaoui · May 30, 2018

I got the same problem (column not exist) but when I try to run migrate not with makemigrations (it is the same issue I believe)

  • Cause: I removed the migration files and replaced them with single pretending intial migration file 0001 before running the migration for the last change

  • Solution:

    1. Drop tables involved in that migration of that app (consider a backup workaround if any)
    2. Delete the rows responsible of the migration of that app from the table django_migrations in which migrations are recorded, This is how Django knows which migrations have been applied and which still need to be applied.

And here is how solve this problem:

  • log in as postgres user (my user is called posgres):

    sudo -i -u postgres

  • Open an sql terminal and connect to your database:

    psql -d database_name

  • List your table and spot the tables related to that app:

    \dt

  • Drop them (consider drop order with relations):

    DROP TABLE tablename ;

  • List migration record, you will see migrations applied classified like so:

id | app | name | applied
--+------+--------+---------+

SELECT * FROM django_migrations;
  • Delete rows of migrations of that app (you can delete by id or by app, with app don't forget 'quotes'):

    DELETE FROM django_migrations WHERE app='yourapp';

  • log out and run your migrations merely (maybe run makemigrations in your case):

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

Note: it is possible that in your case will not have to drop all the tables of that app and not all the migrations, just the ones of the models causing the problem.

I wish this can help.