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.
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!
For Django 1.10.4
I deleted the db.sqlite3 file from the project folder and then ran the following commands:
- python manage.py makemigrations app_name
- python manage.py migrate
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!
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
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.
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.
Delete the migration folder from your migration app folder and simply run the migration commands:
python3 manage.py makemigrations appname
python3 manage.py migrate
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!
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%
python manage.py makemigrations appname --empty
python manage.py makemigrations appname
python manage.py migrate
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
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.
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 🙂
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.
Below steps solved the problem for me
-
Delete all migrations files
-
python manage.py makemigrations (Create your initial migration file 0001_inital.py)
-
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 )
- python manage.py migrate
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
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.
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!
For Django 1.10.4
I deleted the db.sqlite3 file from the project folder and then ran the following commands:
- python manage.py makemigrations app_name
- python manage.py migrate
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!
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
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.
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.
Delete the migration folder from your migration app folder and simply run the migration commands:
python3 manage.py makemigrations appname
python3 manage.py migrate
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!
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%
python manage.py makemigrations appname --empty
python manage.py makemigrations appname
python manage.py migrate
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
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.
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 🙂
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.
Below steps solved the problem for me
-
Delete all migrations files
-
python manage.py makemigrations (Create your initial migration file 0001_inital.py)
-
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 )
- python manage.py migrate