How to recreate a deleted table with Django Migrations?

Question:

There are two models Groups and Students and only one table for Groups of them, the Students table was deleted.

How to make Django recreate the deleted table? If I do makemigrations it prints "No changes detected".

On admin page when I click on the Students table it throws an exception:

relation "students_students" does not exist

Answers:

There isn’t an easy way to get Django to recreate a table that you have deleted manually. Once your database is altered manually, Django’s view of the database (from migrations) is different from reality, and it can be tricky to fix.

If you run the sqlmigrate command, it will show you the required SQL to create the table. You can run the sql in a database shell. Assuming your app name is students, and the migration that created the table was 00XX_create_students.py, you would do:

./manage.py sqlmigrate students 00XX_create_students

Be careful if there are foreign keys to or from the students table, the constraints will have to be created as well.

Answered By: Alasdair

I create table manualy and it helps.

In django 1.7 you can try:

1. Delete your migrations folder

2. In the database: DELETE FROM django_migrations WHERE app = 'app_name'.
   You could alternatively just truncate this table.

3. python manage.py makemigrations

4. python manage.py migrate --fake

If you are working in django 1.9.5 this is the 100 % solution for this problem:

1. Delete your migrations folder

2. In the database: DELETE FROM django_migrations WHERE app = 'app_name'.
   You could alternatively just truncate this table.

3. python manage.py makemigrations app_name

4. python manage.py migrate

This works 100% for me!

Answered By: Raúl EL

For Django 1.10.4
I deleted the db.sqlite3 file from the project folder and then ran the following commands:

  1. python manage.py makemigrations app_name
  2. python manage.py migrate
Answered By: siddharth

Django 1.11.2 using MariaDB, accidental drop of database table.
To recreate table, try the following:
1/ Delete all except for init.py in your app/migrations directory
2/ select * from django_migrations; delete from django_migrations where app = ‘yourapp’;
3/ Check your model is good and run: python manage.py makemigrations
4/ python manage.py migrate

Works for me!

Answered By: user2519486

I just deleted my migrations folder, dropped the whole database, then i made migration for the app

python3 manage.py makemigration 
python3 manage.py migrate

and it came back.

Rename the deleted table name to some_new_name in the models.py and run:

python3 manage.py makemigration
python3 manage.py migrate

again rename the some_new_name table to the original name and run

python3 manage.py makemigration
python3 manage.py migrate

finally, go to the dbshell and drop the table some_new_name

Answered By: Programming-Lover

The answer that worked for me is as follows:

Assume in your database a table of a model has been deleted and you need to re-create, then do the following.

  • comment out the model in models.py that creates the table that has been deleted (either the model class or a line that creates a table like a = models.ManyToManyField(...))

  • run: python manage.py makemigrations <app-name>, where <app-name> is the name of of the app where you have models.py

  • run: python manage.py migrate --fake <app-name>

  • un-comment the model in models.py

  • run: python manage.py makemigrations <app-name>

  • run: python manage.py migrate <app-name> (without the –fake)

and you the table should be back in the database. But any data that was in the table will be lost.

Answered By: Bruno Vermeulen

The only way that worked for me:

rm -r <app-name>/migrations/
python manage.py makemigrations <app-name>
python manage.py sqlmigrate <app-name> 0001_initial

Copy what it prints out (or, depending on what you have actually removed from the DB, only part of the SQL queries).

Apply those copied queries to your DB:

psql -U user_name -h 127.0.0.1 database_name

Paste what you have copied from the SQL queries printout.

Commit the queries.

And that’s it – your missing tables are created.

Answered By: Airstriker

Delete the migration folder from your migration app folder and simply run the migration commands:

  1. python3 manage.py makemigrations appname
  2. python3 manage.py migrate
Answered By: navdeep singh

Django 3.1.3

After deleting a database table directly in postgresql – a related table in an app.

The solution from Airstriker worked for me.
Thank you!

Answered By: Ernst Plesiutschnig

if you have created your classes and performed the migration operation, and then you want to add items to your classes, empty the migration folder with this command beforehand.
In Django 3, I proceeded according to the following steps and it worked 100%

  1. python manage.py makemigrations appname --empty
  2. python manage.py makemigrations appname
  3. python manage.py migrate
Answered By: Aghil Padash

Jan 2021

I had a migration problem and I had to drop/delete a table by pgadmin. Then, when I makemigrations and migrate the table wasn’t recreated. In this way, I’ve found this procedure which worked for me:

python manage.py migrate --fake app_name zero 
python manage.py migrate app_name

[NOTE]

  • If you don’t have the intended migration file, create that before the above commands by python manage.py makemigrations
  • If you don’t want to roll back to the initial(zero) state use the number of migration file instead of zero, e.g. python manage.py migrate --fake myappname 0005
  • I tested this approach in Django 2.2

Read More

Actually, the above methods did not work for me, so I just perform the below workaround as I did not want to manually write the whole query to create the table.

So I changed the database in the settings file and re-ran the migrations command after deleting the migrations folder, then just performed the python migrate command it created new tables in another database then from there just opened the table in query view, copied the script, and inserted the table in my main database.

Answered By: simar

Another Simple way to do this is

  • Go to your migrations folder.
  • Search for the file which contains the code to create the Students table in DB.
  • Remove the code snippet from the file and save it.
  • Then run py manage.py makemigrations and py manage.py migrate again

This worked for me 🙂

Answered By: Akshay Ratimani

In this case, you need to trick django!
Do one thing…

  • copy the "students" model in models.py with other name like
    "studentscopy".
  • Now run –> python manage.py makemigration
  • It will create a new migration in migration package of your app. Open
    that last migration and rename "studentscopy" back to "students"
    in that file.
  • Now run –> python manage.py migrate

It will create the table again with "students" name and at last delete that "studentscopy" model from your models.py file.

Answered By: Shashank Jain

Below steps solved the problem for me

  1. Delete all migrations files

  2. python manage.py makemigrations (Create your initial migration file 0001_inital.py)

  3. python manage.py migrate –fake <app_name> zero

( Tell Django to mark the migrations as having been applied or unapplied, but without actually running the SQL to change your database schema. This brings the migrations to zeroth state. Otherwise Django will think there’s no change to apply )

  1. python manage.py migrate
Answered By: Aditya Ganguli