I was recently adding a slug field to a model in a Django application when I ran into this error when doing the South migration:
Error in migration: test_app:0002_auto__add_field_category_slug DatabaseError: table "_south_new_test_app_category" already exists
When South makes changes to an existing table, it creates a new
table with a temporary name. The table is named
"_south_new_" + table_name. In this case, the new table name is
Assuming the changes are successful, the old table is deleted and replaced with the new table.
However, the previous migration failed and the temporary table still existed.
To fix this, we need to drop the temporary table and redo the migration.
If you are not familiar with dropping a table, you can run the
command to get a list of the drop table sql statements for an app. For
this test app it looks like this:
> python manage.py sqlclear test_app BEGIN; DROP TABLE "test_app_person"; DROP TABLE "test_app_category"; DROP TABLE "test_app_organization"; DROP TABLE "_south_new_test_app_category"; COMMIT;
Using the syntax you see from
sqlclear you can run the
dbshell command and drop temporary table.
> python manage.py dbshell sqlite> DROP TABLE "_south_new_test_app_category";
Now as long as you fixed the issue with the migration that failed, you can run the migration again and it will work as planned.