South的简单说明:
在django中如果我们已经syncdb之后,再增加或者删除属性列的时候,djnago自带的sybcdb并不能够再次同步,这个工具不能同步models和数据库,是有缺陷的,可以用south作为代替其的工具,South 能够检测对models的更改并同步到数据库。
South的基本使用方法:
安装South:fedora下 #sudo easy-install South;
将South作为app添加到setting文件中:INSTALL_APP添加south;
对于第一次使用的情况:
python manage.py schemamigration yourappname --initial # --initial在数据库创建models定义的表,以及South需要的south_migrationhistory表,另外会在yourappname下创建一个migration的子目录 #以后每次对models修改以后,可以运行如下两条命令同步到数据库 python manage.py schemamigration yourappname --auto #检测对models的更改 python manage.py migration yourappname #将更改反映到数据库
对于一个已经存在的项目(定义好了models,创建了相应的数据库,保存了响应的数据),这个时候需要设置以下步骤:
#在setting 文件的INSTALL_APP添加south,然后 python manage.py syncdb #syncdb已经被South修改,用来创建south_migrationhistory表 python manage.py convert_to_south yourappname#在yourappname下创建migration目录
以后就可以在这个项目中正常使用South了,每次修改以后重新启动server。
South的同步原理:
对应每次models执行schemamigration后会在migration目录下生成对应此次更改的py文件,称之为migrate,件名形如0002_autodel_field_notes_create_user.py,同步数据库的时候会顺序(文件名 ASCII排序)执行这些py文件,文件里包含一个Migration类,里边有两个方法forwards和backwards,将更改同步到数据库会执行forwards方法,数据库操作失败会调用backwards实现rollback功能。
常见问题
1. 添加和删除字段时可能会要求输入 default value(django里面models里面的许多字段默认都是null=False)
对于添加字段,输入的默认值必须和models定义的类型匹配,否则同步数据库的时候会报错
对于删除字段的情况,可以随意输入一个value而不管字段的默认类型,可以实现删除,但是并不可取,具体原因可以参见South的实现机制(rollback到删除字段之前会失败)。
2. 杀手锏
如果South在同步数据库的过程中出现错误,则migrations目录下面对应此次更改的python文件不会被执行,可以运行python manage.py migrate --list查看没有执行的py文件,文件名前面没有*表示该文件对应的更改没有反应到数据库,只需删除掉这些有问题的migrate,参照错误提示修改 models再同步即可,也可以直接更改对应的py文件修复错误