Hi Lie,
In addition to Andrew's wise advice, I'd like to point one detail:
Depending on the database backend you use, you may need to consider "dry runs"
-- these are done on MySql and Oracle in attempt to at least check the
migrations before starting to run them for real -- as on these databases,
schema changes cannot be done in a transaction which will be rolled back if
something fails along the way. In mixed schma+data migrations, the data
sections need to be put under "if not db.dry_run:".
HTH,
Shai.