I started a django 1.8 project, which uses the migrations system.
Somehow along the way things got messy, so I erased the migrations folders and table from the DB, and now I'm trying to reconstruct them, with no success.
I have three apps (3 models.py
files), and the models reflect the tables EXACTLY!
The best approach that I've found so far was:
migrations
folders. Done!django_migrations
table. Done!python manage.py makemigrations --empty <app>
for every app. Done!python manage.py migrate --fake
. Done! (although it works only if I run it after every makemigrations
command.Now I add a new field, run the makemigrations
command, and I receive the following error:django.db.utils.OperationalError: (1054, "Unknown column 'accounts_plan.max_item_size' in 'field list'")
I've been burning HOURS on this thing. How the h**l can I initialize the migrations so I can continue working without migration interruptions every time?
Why is it so complicated? Why isn't there a simple one-liner: initiate_migrations_from_schema
?
EDIT:
Now things get even nastier. I truncated the django_migrations
table and deleted all the migrations
folder.
Now I try to run python manage.py migrate --fake-initial
(something I found in the DEV docs), just so it sets up all of Django's 'internal' apps (auth, session, etc) and I'm getting:(1054, "Unknown column 'name' in 'django_content_type'")
.
Now, this "column" is not a real column. It's a @property
defined in Django's contenttypes
app. WHAT IS GOING ON HERE? Why is it identifying the name
property as a real column?
Create or update a model. Run ./manage.py makemigrations <app_name> Run ./manage.py migrate to migrate everything or ./manage.py migrate <app_name> to migrate an individual app. Repeat as necessary.
makemigrations is responsible for packaging up your model changes into individual migration files - analogous to commits - and migrate is responsible for applying those to your database.
Reset the Whole Database in Django sqlite3 and then delete all the migrations folders inside all the apps. After deleting the migrations folders, we can remake the migrations and migrate them using two commands; namely, python manage.py makemigrations and python manage.py migrate .
Steps to rerun a Django migration:Fake back to the migration immediately before the one you want to rerun. Rerun the target migration. Fake back to the latest migration.
Finally got it to work, although I don't know why and I hope it will work in the future.
After doing numerous trials and going through Django's dev site (link).
Here are the steps (for whoever runs into this problem):
django_migrations
table: delete from django_migrations;
migrations
folder: rm -rf <app>/migrations/
python manage.py migrate --fake
python manage.py makemigrations <app>
. Take care of dependencies (models with ForeignKey's should run after their parent model).python manage.py migrate --fake-initial
After that I ran the last command without the --fake-initial
flag, just to make sure.
Now everything works and I can use the migrations system normally.
I'm sure I'm not the only one who encounters this issue. It must be documented better and even simplified.
Update for Django 1.9 users:
I had this scenario again with a Django 1.9.4, and step 5 failed.
All I had to do is replace --fake-initial
with --fake
to make it work.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With