56

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?¡?

1
  • The issue lies in the migration files. To fix it, you should either: * Run migrations after every model update and then push the changes to production, or * Stop ignoring the migrations folder and push it along with your updates once they’re complete. Commented Oct 19 at 0:16

21 Answers 21

43

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.

Sign up to request clarification or add additional context in comments.

4 Comments

Had the same issue. Dropping tables and re-running migration in heroku console solved it. Thanks !
DROP TABLE tablename ; will erase all data in the app right?
@Florent it will remove the table itself (so yes data of that table will be erased)
With all these being said, dont forget to backup your data
21

Django migrations are recorded in your database under the 'django_migrations' table. This is how Django knows which migrations have been applied and which still need to be applied.

Have a look at django_migrations table in your DB. It may be that something went wrong when your migration was applied. So, delete the row in the table which has the migration file name that is related to that column that 'does not exist'. Then, try to re-run a migration.

5 Comments

Why wouldn't you use the rollback feature? I naively tried this and ended up with a dependency history error and restored from the backup I had just created. Use this with some caution.
Could you provide a link to the rollback feature in the docs?
Wow, can't find it. I still advise caution using this answer but the closest thing I found is this script: gist.github.com/Jc2k/bacff3105653f3b28e84
Yeah, I didn't think it existed either. Not sure why you received a dependency history error. Maybe it depends on Django version? Either way, this quick-fix should only be applied in development which should be clear...
Reversing migrations documentation: docs.djangoproject.com/en/4.1/topics/migrations/…
14

Here's what i tried and it worked:

  • Go and add manually the column to your table
  • run python manage.py makemigrations
  • go back drop that column you added
  • run python manage.py migrate

2 Comments

How do you add column manualy ?
use pgadmin if you're using postgres
13

I had a similar issue - the error message appeared when I clicked on the model on the django-admin site. I solved it by commenting out the field in models.py, then running migrations. Following this I uncommented the field and re ran the migrations. After that the error message disappeared.

2 Comments

I removed all migration files and commenting out worked for me too.
@GraceBe I tried the same thing, but it doesnt seem to be helping...
5

My case might be a bit obscure, but if it helps someone, it is worth documenting here.

I was calling a function in one of my migrations, which imported a Model of said migration regularly, i.e.

from myApp.models import ModelX

The only way models should be imported in migrations would be using e.g. RunPython:

def myFunc(apps, schema_editor): 
    MyModel = apps.get_model('myApp 'MyModel')

and then calling that function like so:

class Migration(migrations.Migration):
    operations = [
        migrations.RunPython(initialize_mhs, reverse_code=migrations.RunPython.noop),
    ]

Additionally the original import worked until I modified the model in a later migration, making this error harder to locate.

2 Comments

Indeed, when renaming or removing fields it can be tricky importing models, especially when you have custom code manipulating those fields. This solution solves this.
PS: There is a typo: MyModel = apps.get_model('myApp 'MyModel') should be MyModel = apps.get_model('myApp', 'MyModel')
2

Just remove corresponding row migrations for that model in 'django_migrations' model in database.

And re run python manage.py migrate app_name

Comments

1

So, I always run into this sort of problem, so today I decided to try and work it out at the database level. Thing is, I changed a model field name which Django didn't bother reflecting in a migration file. I only found out later when I ran into problems. I later looked at the migration files and discovered there was no migration for that change. But I didn't notice because I made other changes as well, so once I saw a migration file I was happy. My advice. Create migration for each change one at a time. That way you get to see if it happened or not.

So here's my working through it in MySQL.

open mysql console.

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

If you're using postgresql, just google the corresponding commands.

Comments

1

The issue was in the Models for me, for some reason Django was adding '_id' to the end of my Foreign Key column. I had to explicitly set the related named to the Foreign Key. Here 'Cards' is the parent table and 'Prices' is the child table.

class Cards(models.Model):
    unique_id = models.CharField(primary_key=True, max_length=45)
    name = models.CharField(max_length=225)   

class Prices(models.Model):
        unique_id = models.ForeignKey(Cards, models.DO_NOTHING)

Works after changing to:

class Cards(models.Model):
    unique_id = models.CharField(primary_key=True, max_length=45)
    name = models.CharField(max_length=225)   

class Prices(models.Model):
        unique_id = models.ForeignKey(Cards, models.DO_NOTHING, db_column='unique_id')

1 Comment

Django always adds the '_id'. See docs.djangoproject.com/en/2.2/ref/models/fields/…
1

When I get this error, my extreme way to solve it is to reset my database:

  1. Reset your database

For Postgresql on Heroku:

Heroku > your_app > Resources > database > add-ons > click on your database and open it

For postgresql

settings > Reset database

  1. Delete all files in your_app > migrations > __pycache__ except __init.py__
  2. Delete all files in your_app > migrations except __pycache__ folder and __init.py__
  3. Then run:

    python manage.py makemigrations

    python manage.py migrate

    python manage.py createsuperuser

type in to create your superuser, then run:

python manage.py makemigrations

python manage.py migrate

python manage.py 

If you are able to inspect your models from your admin section, then it should be all okay now.

Comments

0

I tried all these answers with not much luck! What I did to have this problem solved with no harm was to go back through the migration files and find where the actual model was being created for the first time then manually add the field (in the column not being existed error message). Until if you run makemigrations --dry-run you get/see "No changes detected" and that worked. Basically, in my case, I had to carefully take my desired db changes back in time in proper migration file, rather creating a new migration now at the end of migration dependency chain.

Comments

0
  1. Open the latest py file created after running the makemigrations command inside migrations folder of that particular app.
  2. Inside class Migration there is a list attribute called 'operations'.
  3. Remove the particular elements migrations.RemoveField(...).
  4. Save and run python manage.py migrate.

Comments

0

A easier solution to the problem is to make your models exactly like it is in the migration first. and run python manage.py migrate.

Then revert those changes

Run

python manage.py makemigrations
python manage.py migrate

To check for which migrations are applied and which are not, use -:

python manage.py showmigrations

Comments

0

I solved a similar problem by deleting all migrations files (Don't forget to make a backup) and python manage.py makemigrations all of them into one clean file in development and pulling new files on the server. Before then I had dropped existing tables on the PostgreSQL.

Comments

0

I was getting this error for some reason when Django was looking for a column of type ForeignKey named category_id when the actual name in the database was category. I tried every Django solution I could imagine (renaming field, explicitly setting column name, etc.). I didn't want to drop tables or rows as this was a production database. The solution was simply to rename the column manually using SQL. In my case:

ALTER TABLE table_name 
RENAME COLUMN category TO category_id;

Make sure you backup your database, ensure this won't break any other applications consuming that particular table, and consider having a fallback column if necessary.

Comments

0

For me, this was being caused because someone had accessed the model globally in a module. The module was attempting to retrieve an instance of the model every time it was loaded. Makemigrations loads the app, so this was attempting to query a model that had new fields before the migration was created or applied. You can see if this is happening for you by checking the stack trace...

Comments

0

If you only see this error when running tests and you always run tests with the --keepdb flag on, consider removing the flag.

# From `python manage.py test --keepdb` to:
python manage.py test

The --keepdb flag will preserve the test database between test runs. If you performed migrations that add/remove columns and you run tests with --keepdb flag still on, it will load the preserved test database with an outdated schema instead of creating a new test database with the latest schema.

Comments

0

This steps make it work for me

WARNING: this actions remove all data in that table(model)

  1. Comment or remove model that have conflict
  2. Run pyhton manage.py makemigrations
  3. Run pyhton manage.py migrate
  4. Uncomment or rewrite removed model
  5. Run pyhton manage.py makemigrations
  6. Run pyhton manage.py migrate

Comments

0

It may seem easier to delete migration files or drop your database in development but if you are in production with users data in your database, you should proceed with caution.

I faced this same issue after altering my models by adding a OneToOneField relation to it. Behind the scenes, Django appended "_id" to the OneToOneField name to create its database column name. I ran migrations to sync my db but was getting this error. I then used python manage.py dbshell to check my Postgres database and saw that indeed the column did not exist. Instead of dropping my database or deleting migration files, I ran the following commands in dbshell:

ALTER TABLE table_name 
ADD COLUMN column_name_id datatype;

This resolved the error and added the missing column to my database with my existing data intact. Do note that datatype is the type of data the field holds e.g. text, varchar etc.

Comments

0

The issue lies in the migration files. To fix it, you should either:

  • Run migrations after every model update and then push the changes to Render, or

  • Stop ignoring the migrations folder and push it along with your updates once they’re complete.

1 Comment

Your answer could be improved with additional supporting information. Please edit to add further details, such as citations or documentation, so that others can confirm that your answer is correct. You can find more information on how to write good answers in the help center.
-1

These are the potential reasons why you encounter that problem:

Check Migrations

  • Make sure that you've applied the migrations with your application name at the end

python manage.py makemigrations app-name

Validate Database Schema

  • Confirm that the database schema aligns with the model definitions within your Django application. Utilize a suitable database tool or query to examine the actual schema.

Retry Migration

  • In case there is suspicion of an issue with a specific migration, attempt to roll back to a previous migration and then reapplied migrations.
python manage.py migrate app_name zero  # Rollback all migrations
python manage.py migrate                # Apply migrations again

Correct Definitions

  • Double-check for any typos in your model definitions, particularly in field names. Maintain consistency between your model and database naming conventions.

Verify Database Connection:

  • Validate that your Django application has established connectivity with the correct database and that relevant settings in your settings.py file are accurate.

Resetting the Entire Database (last resort):

  • If all else fails and data loss can be tolerated, it may be necessary to completely reset the database before reapplying migrations

python manage.py flush

Comments

-4

Solved this issue by running python manage.py migrate in Heroku Bash shell

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.