If you want to modify your model, the diango
doc
suggests change the model and then manually run ALTER TABLE
statements in your db to propagate the changes. This is a bit annoying
to do if you have more then X modifications to do. The good reason to
avoid automation here, is that if something goes wrong, you loose your
data (and backups ??), and nobody, not even a robot overlord, wants to
assume this responsability. A different strategy, that still requires
manual intervention was suggested to my on the django IRC channel.
Basically we save the data, remove everything, recreate the DB, reload the data. Let’s go thought the procedure:
-
First we save the data, storing everything in a fixture, that is a json marshaling of the DB using this command:
./manage.py dumpdata udf > udf.json
. Notice that mymanage.py
is often also referred asdjango-admin.py
. -
Now it’s time to clean up the DB. Since we are working on a module, we can generate automatically the
DROP TABLE
statements using the following command :
./manage.py sqlclear udf
BEGIN;
DROP TABLE "udf_solution";
DROP TABLE "udf_solver";
DROP TABLE "udf_conversion";
DROP TABLE "udf_cudf";
DROP TABLE "udf_dudf";
COMMIT;
Once we have the sql statements, we just need to open the db and cut and paste them on the command line.
-
OK ! it’s finally time to actually modify the model.py file, add attributes. Something to be careful about is to specify a default value for all the new attributes. This was the when loading the data, the django infrastructure will know who to fill these fields.
-
Once done, we can recreate the tables with the command :
./manage.py syncdb
. -
And Finally reload the data
./manage.py loaddata udf.json
I think this recipe only works if you are adding new fields. If you are removing a field, I’m not sure then loaddata routine is smart enough to ignore the field… to be tested. Feedback appreciated.