django中使用south同步对model的修改

来源:互联网 发布:末日数据化小说 女主 编辑:程序博客网 时间:2024/05/18 00:32

1.安装south:pip install south

2.把south添加到INSTALLED_APPS中

3.运行syncdb命令:python manage.py syncdb(该命令会读取INSTALLED_APPS,检测到south后,会生成south_migrationhistory数据表

4.运行命令:python manage.py schemamigration yourappname --initial(在yourappname目录下创建migrations目录,并且会在该目录下自动创建0001_initial.py 以及__init__.py。注意:就算有多个app,也只需要initial一个即可)

5.运行命令:python manage.py migrate yourappname(将更改反应到数据库(如果出现表已存在的错误,后面加 --fake

以后每次对models更改后,可以运行以下两条命令同步到数据库
python manage.py schemamigration youappname --auto #检测对models的更改
python manage.py migrate youappnam #将更改反应到数据库(如果出现表已存在的错误,后面加 --fake)


恢复到以前的models:

South好处就是可以随时恢复到之前的一个版本,比如我们想要回到最开始的那个版本:

运行:python manage.py migrate yourappname  0001

这样,数据库就回到了最开始的模型。当然,前提是你得保留之前migrations目录中的文件,这样才能随时回退到任何一个版本。

——————————————————————————————————

数据迁移
django 项目提供了一个导出的方法 python manage.py dumpdata, 不指定 appname 时默认为导出所有的app
python manage.py dumpdata myapp > myapp.json
导出的文件内容格式:
[  {    "model": "myapp.person",    "pk": 1,    "fields": {      "first_name": "John",      "last_name": "Lennon"    }  },  {    "model": "myapp.person",    "pk": 2,    "fields": {      "first_name": "Paul",      "last_name": "McCartney"    }  }]
数据导入:
python manage.py loaddata myapp.json
导出用户数据:
python manage.py dumpdata auth > auth.json

——————————————————————————————————

Django不关心数据库表中是否存在未在模型中定义的列。
Django不关心数据库中是否存在未被模型表示的table。


参考:http://www.weiguda.com/blog/2/

http://www.tuicool.com/articles/jaUjaae

http://blog.csdn.net/y6300023290/article/details/18005383

http://www.ziqiangxuetang.com/django/django-data-migration.html

另外,这里有一篇文章也有一些注意点,写的挺好,这里就直接粘过来并附上原文链接了:

migrations的概念

migrations告诉django数据库的模式如何从一个版本update到另一个版本,用这些migrations可以讲数据库模式在版本之间切换

migrations基本用法

1)初始化一个app    ./manage.py schemamigration southtest --initial    这时候在southtest的目录下就有了文件夹migrations2)其他的时候用    ./manage.py schemamigration southtest --auto3)最后提交变更用    ./manage.py migrate southtest 数据库变更4)south 能检测到并且修改的改动:增加了一个fieldunique=TrueManyToMany fieldCustiom fields得自己定义,south没这么智能    自定义Field 查看south文档的第四章Custom Fields****查看可以执行的migration*很重要***./manage.py migrate --list | grep -v "*"southtut(*) 0001_initial(*) 0002_auto__add_field_knight_dances_whenever_able(*) 0003_auto__add_field_knight_shrubberies( ) 0004_auto__add_unique_knight_name有*号标识已经执行过的用./mange.py migrate myapp 0001 --fake 来假执行一个migration。

让现有的App来用south

./manage.py convert_to_south myapp

数据迁移

1)先运行 ./manage.py datamigration southtest (name)  name为脚本描述的名称2)然后找到 migration 文件下的 00x_name.py     def forwards(self,orm):        import ....        for i in orm.User.objects.all():            i.name = i.name+'!!'            i.save()    def backwards(self,orm):        raise RuntimeError("cannot reverse this migration.")说明:数据迁移的时候如果想冻结其他的model 只要传参数 在datamigration 后面传参数--freeze appname 即可 {还没有试过}

我们该注意的事项

1)在执行migrate操作的时候先使用 migrate app --list 看看有哪些还没执行过。然后在此app中找到migration文件中没有执行的文件,看看是由有必要执行,没必要执行的时候之间./manage.py myapp (name) --fake 来跳过2)很多field 没有定义default的时候,运行./manage.py migrate 的时候要求输入默认值,一般给""或者0。更好的习惯是直接赋值一个default
原文链接:http://www.jiancool.com/article/62022099299/
0 0