Django: update database schema without losing data

后端 未结 3 419
别那么骄傲
别那么骄傲 2020-12-30 14:20

What is the best solution if I want to upgrade (alter) my database schema (add new fields to tables by adding them just to Django models) without losing data in these tables

相关标签:
3条回答
  • 2020-12-30 14:41

    Django 1.7 has built-in migrations support.

    See https://docs.djangoproject.com/en/dev/releases/1.7/#schema-migrations

    0 讨论(0)
  • 2020-12-30 14:42

    Learning curve...

    http://south.aeracode.org/

    South was merged into django core at version 1.7.
    There is now a native django feature for data migration on schema changes.

    0 讨论(0)
  • 2020-12-30 15:03

    When south isn't an option I just manually write scripts for small changes. and big ones i use

    ./manage.py dumpdata appname
    

    http://docs.djangoproject.com/en/dev/ref/django-admin/#dumpdata-appname-appname-appname-model

    Throw that into a file. Run a regex replace to update any added /removed fields and then a reset of that app is possible. I have to admit i haven't done this in a while but i can get some specific code to do this for you if needed.

    it loads back up with loaddata

    edit

    Django dump data for a single model? This Question is similar and might have the info i was talking about.

    Still let me know if you need and i'll dig up my old script (or write out a nice simple one) for you.

    UPDATE

    ./manage.py dumpdata appname --indent=4 > appname.json
    
    #open your fav text editor and do a find/replace 
    
    ./manage.py reset appname
    ./manage.py loaddata appname.json
    

    That should do it. When you do a find replace you only need to remove fields that you don't have any more and add fields that aren't nullable. (as a minimum).

    Notes: the --indent=4 nicely formats everything for you. It means 4 spaces. the ./manage.py reset only works in pre django 1.3 (gah!) in django 1.3 you will have to do a ./manage dbshell and drop table. The sql for that is found from command ./manage.py sqlreset appname.

    0 讨论(0)
提交回复
热议问题