django south [app]

migrations的概念

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

migrations基本用法

1)初始化一个app
    ./manage.py schemamigration southtest --initial
    这时候在southtest的目录下就有了文件夹migrations
2)其他的时候用
    ./manage.py schemamigration southtest --auto
3)最后提交变更用
    ./manage.py migrate southtest 数据库变更

4)south 能检测到并且修改的改动:
增加了一个field
unique=True
ManyToMany field
Custiom 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

你可能感兴趣的:(django)