How to simplify migrations in Django 1.7?
In the Django 1.7 version of migrations the reset functionality that used to be in South has been dropped in favor of new functionality for 'squashing' your migrations. This is supposed to be a good way to keep the number of migrations in check.
https://docs.djangoproject.com/en/dev/topics/migrations/#squashing-migrations
If you still want to really start from scratch i assume you still could by emptying the migrations table and removing the migrations after which you would run makemigrations
again.
Assuming this is your project structure,
project_root/
app1/
migrations/
app2/
migrations/
...
manage.py
remove_migrations.py
you can run the script remove_migrations.py from the the place indicated above to delete all migrations files.
#remove_migrations.py
"""
Run this file from a Django =1.7 project root.
Removes all migration files from all apps in a project.
"""
from unipath import Path
this_file = Path(__file__).absolute()
current_dir = this_file.parent
dir_list = current_dir.listdir()
for paths in dir_list:
migration_folder = paths.child('migrations')
if migration_folder.exists():
list_files = migration_folder.listdir()
for files in list_files:
split = files.components()
if split[-1] != Path('__init__.py'):
files.remove()
Manually deleting can be tiring if you have an elaborate project. This saved me a lot of time. Deleting migration files is safe. I have done this an umpteenth number of times without facing any problems...yet.
However when I deleted the migrations folder, makemigrations
or migrate
did not create the folder back for me. The script makes sure that the migration folder with its __init__.py
stays put, only deleting the migration files.
I just had the same problem. Here's my workaround.
#!/bin/sh
echo "Starting ..."
echo ">> Deleting old migrations"
find . -path "*/migrations/*.py" -not -name "__init__.py" -delete
find . -path "*/migrations/*.pyc" -delete
# Optional
echo ">> Deleting database"
find . -name "db.sqlite3" -delete
echo ">> Running manage.py makemigrations"
python manage.py makemigrations
echo ">> Running manage.py migrate"
python manage.py migrate
echo ">> Done"
The find
command: http://unixhelp.ed.ac.uk/CGI/man-cgi?find
I got this. I just figured this out and it is good.
First, to clear migrations table:
./manage.py migrate --fake <app-name> zero
Remove
app-name/migrations/
folder or contents.Make the migrations:
./manage.py makemigrations <app-name>
Finally tidy up your migrations without making other database changes:
./manage.py migrate --fake <app-name>