131π
I would just do the following on both the environments (as long as the code is the same)
- Delete your migrations folder
- DELETE FROM django_migrations WHERE app =
<your app name>
. You could alternatively just truncate this table. python manage.py makemigrations
python manage.py migrate --fake
After this all your changes should get detected across environments.
109π
Run
python manage.py migrate your_app zero
This will drop all tables from your_app
If you want, since you said you want to start over, you can delete your migrations folder, or maybe rename the folder, create a new migrations folder and run
python manage.py makemigrations your_app
python manage.py migrate your_app
Just like south, you can always go back and forthβ¦
# Go to the first migration
python manage.py migrate your_app 0001
# Go to the third migration
python manage.py migrate your_app 0003
So imagine that your 4th migration is a mess⦠you can always migrate to the 3rd, remove the 4th migration file and do it again.
Note:
This one of the reasons your models should be in different apps. Say you have 2 models : User and Note. Itβs a good practice to create 2 apps: users and notes so the migrations are independent from each other.
Try not use a single application for all your models
- [Django]-Django Rest Framework β Authentication credentials were not provided
- [Django]-Create Django model or update if exists
- [Django]-Google Static Maps URL length limit
37π
A minor variation on harshilβs answer:
$ manage.py migrate --fake <appname> zero
$ rm -rf migrations
$ manage.py makemigrations <appname>
$ manage.py migrate --fake <appname>
This will β¦
- pretend to rollback all of your migrations without touching the actual tables in the app
- remove your existing migration scripts for the app
- create a new initial migration for the app
- fake a migration to the initial migration for the app
- [Django]-Django REST Framework: how to substitute null with empty string?
- [Django]-Numeric for loop in Django templates
- [Django]-No module named pkg_resources
10π
To reset all migrations and start all over, you can run the following:
1. Reset all migration
python manage.py migrate <app_name> zero
βΉοΈ If this is causing you issues you can add the
--fake
flag to the end of the command.
2. Create the migration
python manage.py makemigrations <app_name>
βΉοΈ Only do this step if you deleted or altered the migrations files
3. Migrate
python manage.py migrate <app_name>
β οΈ if you added the
--fake
command to step # 1 you will need to add--fake-initial
to the migrate command sopython manage.py migrate <app_name> --fake-initial
- [Django]-Django REST Framework: how to substitute null with empty string?
- [Django]-Django β "no module named django.core.management"
- [Django]-Django: list all reverse relations of a model
4π
If you want a completely clean start, youβre gonna wanna drop the DB. Which means then to recreate it, add privileges, re-generate all the migrations, re-run them and create a superuser.
Good news is that you can easily make all this into a single/few line commands.
Fresh migration files
If you delete the whole folders, youβre gonna have to run the makemigrations
command mentioning all the app names. Thatβs a hassle if you do this often. To have Django see the apps that need migrations, youβll wanna keep the migrations
folder and the __init__.py
inside them.
Hereβs a bash command for that:
find . -path "*migrations*" -not -regex ".*__init__.py" -a -not -regex ".*migrations" | xargs rm -rf
Then the usual (this should create migrations for all the apps that had migrations before):
python manage.py makemigrations
Resetting the DB
For SQLite just delete the DB file.
For PostgreSQL run this in the console:
psql -c "drop database <db_name>;"
psql -c "create database <db_name>;"
psql -c "grant all on database <db_name> to <db_user>;"
And then finally re-run migrations with
python manage.py migrate
Superuser
Youβre gonna obviously be missing a superuser, so you might wanna also do:
python manage.py createsuperuser
No-input way of doing that is piping python code into the shell:
echo "from django.contrib.auth import get_user_model; User = get_user_model(); User.objects.create_superuser('admin', 'badmin@myproject.com', 'pa$$w0rd')" | python manage.py shell
Generally speaking about these very common actions β Do yourself a favour and write a bit of bash. It has saved me many, many accumulated hours over the years of working with not only Django. Because even better than a oneline command is having a whole utility file to store more of these handy functions. Then you can just run something like:
django --reset_migrations
db --reset <my_db>
django --migrate
Or even aggregate that into a single line if you find yourself repeating the same few actions. Add this to your bashprofile
reset_django() {
find . -path "*migrations*" -not -regex ".*__init__.py" -a -not -regex ".*migrations" | xargs rm -rf
python manage.py makemigrations
psql -c "drop database <db_name>;"
psql -c "create database <db_name>;"
psql -c "grant all on database <db_name> to <db_user>;"
python manage.py migrate
echo "from django.contrib.auth import get_user_model; User = get_user_model(); User.objects.create_superuser('admin', 'badmin@myproject.com', 'pa$$w0rd')" | python manage.py shell
}
My Django lite utilities for inspiration:
#!/bin/bash
django() {
project_name=$(basename $PWD)
project_path="$PWD"
manage_path="${project_path}/${project_name}/manage.py"
if [ ! -f $manage_path ] ; then # No project/manage.py
echo "Error: Could not locate Django manage.py file."
return -1
fi
if [ $# -eq 0 ] ; then
echo "Django project detected."
fi
while [ ! $# -eq 0 ]
do
case "$1" in
--help | -h)
echo "Django shortcut, unknown commands are forwarded to manage.py"
echo " -c, --check Run Django manage.py check."
echo " --req Install requirements."
echo " -r, --run Run server."
echo " -s, --shell Run Django shell plus."
echo " -sd, --shell Run Django shell plus. Debug DB (print sql)"
echo ""
;;
--check | -c)
python $manage_path check
;;
--shell | -s)
python $manage_path shell_plus --bpython
;;
--shell | -sd)
python $manage_path shell_plus --bpython --print-sql
;;
--run | -r)
python $manage_path runserver
;;
--req)
pip install -r $project_path/requirements.txt
;;
--mig | -m)
python $manage_path makemigrations
python $manage_path migrate
;;
--reset_migrations)
find . -path "*migrations*" -not -regex ".*__init__.py" -a -not -regex ".*migrations" | xargs rm -rf
python $manage_path makemigrations
;;
*)
python $manage_path "$@"
;;
esac
shift
done
}
- [Django]-How to get Django and ReactJS to work together?
- [Django]-Trying to migrate in Django 1.9 β strange SQL error "django.db.utils.OperationalError: near ")": syntax error"
- [Django]-Create a field whose value is a calculation of other fields' values
3π
I had a similar issue to this but when testing some of these same solutions using python manage.py showmigrations
I noticed I got the same error.
Eventually I found this post which helped me realize I was overcomplicating things and essentially had two User models defined.
- [Django]-Django filter many-to-many with contains
- [Django]-Celery : Execute task after a specific time gap
- [Django]-Execute code when Django starts ONCE only?
3π
This works for me
Step1:
delete all "migrations" folders in all apps
Step2:
create a brand new app.
python manage.py justTestApp
.
Copy the new "migrations" folder of the new app to all apps
Step3:
delete the "db.sqlite3" file.
delete the "justTestApp" folder
Step4:
python manage.py makemigrations
python manage.py migrate
- [Django]-Why is factory_boy superior to using the ORM directly in tests?
- [Django]-How to squash recent Django migrations?
- [Django]-How do I create a slug in Django?
2π
So this solution worked for me today.
-
Drop the django migrations table called "django_migrations"
(No need to drop the whole database β just the migration table.) -
Deleted all migrations files (e.g. 0002_auto.py, etc) from all your apps, leave the
__init__.py
files. You can use this code from Ahmed Bouchefra:find . -path "/migrations/.py" -not -name "init.py" -delete
find . -path "/migrations/.pyc" -delete
(This find and delete code works only for linux. For Windows you have to delete your files manually.)
-
Now run the following commands:
python manage.py makemigrations python manage.py migrate --fake
django will create a new migration table and fake the initial migration into the table without touching your existing data. Enjoy.
- [Django]-Elegant setup of Python logging in Django
- [Django]-URL-parameters and logic in Django class-based views (TemplateView)
- [Django]-How to resize the new uploaded images using PIL before saving?
2π
Faced similar issue. This worked for me.
python manage.py migrate <app_name> zero --fake
python manage.py migrate <app_name>
- [Django]-Django: guidelines for speeding up template rendering performance
- [Django]-ImportError: Couldn't import Django
- [Django]-In django do models have a default timestamp field?
0π
After you have resetted your unwanted migrations in your project, you can still have the issue of having these unwanted migrations in your test database (the one created by pytest).
You can reset the test database by adding the --create-db
to your test command:
py.test path/to-tests.py --create-db
- [Django]-Django admin TabularInline β is there a good way of adding a custom html column?
- [Django]-STATIC_ROOT vs STATIC_URL in Django
- [Django]-Strings won't be translated in Django using format function available in Python 2.7
0π
As mentioned by @brunofitas, going back to the previous migration helped my case. I thereafter deleted the migrations from that point to the last one, ran makemigrations
, migrated
and I was done.
- [Django]-Django β query filter on manytomany is empty
- [Django]-Check if celery beat is up and running
- [Django]-Create empty queryset by default in django form fields
0π
you can directly delete the migrations folder and migrate it again.
if you want to delete all data from database and delete all the migration:
- delete the migrations folder
- delete sqlite / database
- migrate again
it will give you a fresh database without previous migrations
- [Django]-Django β "no module named django.core.management"
- [Django]-NumPy array is not JSON serializable
- [Django]-How can I disable logging while running unit tests in Python Django?
0π
You can use django zero migrations now:
pip3 install django-zeromigrations
And run:
python3 manage.py zeromigrations
- [Django]-Using Django time/date widgets in custom form
- [Django]-Django project models.py versus app models.py
- [Django]-How to obtain a QuerySet of all rows, with specific fields for each one of them?