I've made a migration that added a new table and want to revert it and delete the migration, without creating a new migration.
How do I do it? Is there a command to revert last migration and then I can simply delete the migration file?
This question is tagged with
~ Asked on 2015-08-20 16:24:31
You can revert by migrating to the previous migration.
For example, if your last two migrations are:
Then you would do:
./manage.py migrate my_app 0010_previous_migration
You can then delete migration
If you're using Django 1.8+, you can show the names of all the migrations with
./manage.py showmigrations my_app
To reverse all migrations for an app, you can run:
./manage.py migrate my_app zero
~ Answered on 2015-08-20 17:00:03
The answer by Alasdair covers the basics
migrateusing the app name and the migration name
But it should be pointed out that not all migrations can be reversed. This happens if Django doesn't have a rule to do the reversal. For most changes that you automatically made migrations by
./manage.py makemigrations, the reversal will be possible. However, custom scripts will need to have both a forward and reverse written, as described in the example here:
If you had a
RunPython operation, then maybe you just want to back out the migration without writing a logically rigorous reversal script. The following quick hack to the example from the docs (above link) allows this, leaving the database in the same state that it was after the migration was applied, even after reversing it.
# -*- coding: utf-8 -*- from __future__ import unicode_literals from django.db import migrations, models def forwards_func(apps, schema_editor): # We get the model from the versioned app registry; # if we directly import it, it'll be the wrong version Country = apps.get_model("myapp", "Country") db_alias = schema_editor.connection.alias Country.objects.using(db_alias).bulk_create([ Country(name="USA", code="us"), Country(name="France", code="fr"), ]) class Migration(migrations.Migration): dependencies =  operations = [ migrations.RunPython(forwards_func, lambda apps, schema_editor: None), ]
This works for Django 1.8, 1.9
Update: A better way of writing this would be to replace
lambda apps, schema_editor: None with
migrations.RunPython.noop in the snippet above. These are both functionally the same thing. (credit to the comments)
~ Answered on 2016-07-14 01:09:30