Django-South介绍
- <strong>??python?manage.py?syncdb??#syncdb已经被South更改,用来创建south_migrationhistory表????python?manage.py?convert_to_south?youappname?#在youappname目录下面创建migrations目录以及第一次迁移需</strong>??
* 以后在这个项目中就可以正常使用South了
South同步原理
* 对应每次 models的更改执行schemamigration后会在migrations目录下面生成对应此次更改的py文件(South称之为 migrate),文件名形如0002_autodel_field_notes_create_user.py,同步数据库的时候会顺序(文件名 ASCII排序)执行这些py文件,文件里包含一个Migration的类,里面有两个方法forwards和backwards,将更改同步到数据库会执行forwards方法,数据库操作失败会调用backwards实现rollback,South还提供了类似回溯的功能。
You can also specify a specific migration to migrate: * python manage.py migrate 0002_autodel_field_notes_create_user.pyNote that, if the system has already migrated past the specified migration, it will roll back to it instead. If you want to migrate all the way back, specify the special migration name zero: * python manage.py migrate zero
常见问题
1. 添加和删除字段时可能会要求输入 default value(django里面models里面的许多字段默认都是null=False)
?? ? 对于添加字段,输入的默认值必须和models定义的类型匹配,否则同步数据库的时候会报错
?? ? 对于删除字段的情况,可以随意输入一个value而不管字段的默认类型,可以实现删除,但是并不可取,具体原因可以参见South的实现机制(rollback到删除字段之前会失败)。
2. 杀手锏
?? ? 如果South在同步数据库的过程中出现错误,则migrations目录下面对应此次更改的python文件不会被执行,可以运行python manage.py migrate --list查看没有执行的py文件,文件名前面没有*表示该文件对应的更改没有反应到数据库,只需删除掉这些有问题的migrate,参照错误提示修改 models再同步即可,也可以直接更改对应的py文件修复错误