update django database to reflect changes in existing models


Question

I've already defined a model and created its associated database via manager.py syncdb. Now that I've added some fields to the model, I tried syncdb again, but no output appears. Upon trying to access these new fields from my templates, I get a "No Such Column" exception, leading me to believe that syncdb didn't actually update the database. What's the right command here?

1
68
4/20/2014 4:20:35 PM

Accepted Answer

Seems like what you need is a migration system. South is really nice, working great, has some automation tools to ease your workflow. And has a great tutorial.


note: syncdb can't update your existing tables. Sometimes it's impossible to decide what to do automagicly - that's why south scripts are this great.

33
12/31/2009 1:28:54 PM

As of Django 1.7+, built-in migrations support, allows for database schema migrations that preserve data. That's probably a better approach than the solution below.

Another option, not requiring additional apps, is to use the built in manage.py functions to export your data, clear the database and restore the exported data.

The methods below will update the database tables for your app, but will completely destroy any data that existed in those tables. If the changes you made to your app model do not break your old schema (for instance, you added a new, optional field) you can simply dump the data before and reload it afterwards, like so:

Django 1.4.15 and earlier

python manage.py dumpdata <your_app> > temp_data.json
python manage.py reset <your_app>
python manage.py loaddata temp_data.json

Django 1.5 and newer

python manage.py dumpdata <your_app> > temp_data.json
python manage.py sqlclear <your_app> | python manage.py dbshell
python manage.py syncdb
python manage.py loaddata temp_data.json

(The reset command was deprecated and then removed in Django 1.5)

If your changes break your old schema this won't work - in which case tools like South or Django Evolution are great.


Licensed under: CC-BY-SA with attribution
Not affiliated with: Stack Overflow
Icon