欢迎阅读South教程;我们将试着介绍South的基本使用,而且会给你关于其他事情的一些常用技巧。
如果你从来没听说过迁移库,可以先看看 什么是迁移;它可以帮你更好的理解South和其他,如django-evolution,目的是要得到什么。
教程假设你已经正确安装了South;若是没有,请看 安装指示。
开始
在教程中,我们在一个全新的app上使用迁移,并详细描述该过程。如果已经存在app也不用担心,我们会在下一部分介绍。
注意到的第1件事是,South是每个应用程序都有的;迁移和app的代码存储在一起的[1]。如果一个app没有任何迁移定义,它就和普通的那样操作(意思是,使用syncdb)。
[1] 你可以把它们放在你喜欢的任何地方。
好,现在找一个project进行工作(或者新建一个,设置好数据库和其他),我们建一个新的app:
./manage.py startapp southtut
通常,会生成一个新目录 southtut/。 先把它添加到 INSTALLED_APPS;然后打开新建的 southtu/models.py,创建一个新的模型:
from django.db import models class Knight(models.Model): name = models.CharField(max_length=100) of_the_round_table = models.BooleanField()
它非常简单,但是有效。不要使用 syncdb 在我们的数据库中创建该模型的数据表,我们将为它生成一个迁移。
第1个迁移
South创建迁移的方法有好几种;有自动的,有手动的。作为入门用户,你一般使用两个自动方法: --initial和--auto。
--auto 检查前一个迁移,算出有什么改变,生成一个迁移以应用这个差异。 如你往模型中添加了一个字段, --auto会注意到这点,生成一个迁移,为该字段在模型的表中创建一个新的列。
当然,你注意到 --auto需要有前一个迁移,而我们的新app没有。所以在这种情况下,我们需要使用 --initial,用它为app中的所有模型创建表和索引;它是你首先要使用的,更多的像 syncdb, 在这之后的每次改变就可以使用--auto。
所以,让我们创建第1个迁移:
$ ./manage.py schemamigration southtut --initial Creating migrations directory at '/home/andrew/Programs/litret/southtut/migrations'... Creating __init__.py in '/home/andrew/Programs/litret/southtut/migrations'... + Added model southtut.Knight Created 0001_initial.py. You can now apply this migration with: ./manage.py migrate southtut
(如果它失败了,抱怨 south_migrationhistory不存在,那是你在安装South之后,忘记了运行 syncdb)
你可以看到,它为我们创建了一个迁移目录,并在其中生成了一个新的迁移。我们所需要做的是应用我们的新迁移:
$ ./manage.py migrate southtut Running migrations for southtut: - Migrating forwards to 0001_initial. > southtut:0001_initial - Loading initial data for southtut.
就这样,South为我们的模型创建了新表,若你喜欢可以做些检查,使用 ./manage.py shell打开交互界面,试着添加一些圆桌骑士。
更改模型
迄今为止,我们做的事情和使用syncdb能完成的没什么差别,到时间来改变这个了(准确的说是,我们的模型)。让我们在模型中增加另外一个字段:
from django.db import models class Knight(models.Model): name = models.CharField(max_length=100) of_the_round_table = models.BooleanField() dances_whenever_able = models.BooleanField()
现在,如果我们没有使用迁移,在我们的southtu_knight表中显示这个新的列将会是非常令人厌倦。然而使用了South,我们只需要两个简单的步骤: 为改变生成一个迁移,然后应用它。
首先,生成新的迁移,使用 --auto特征:
$ ./manage.py schemamigration southtut --auto + Added field dances_whenever_able on southtut.Knight Created 0002_auto__add_field_knight_dances_whenever_able.py. You can now apply this migration with: ./manage.py migrate southtut
(注意,South自动为迁移选择了一个名字;你可以把自定义的名字作为另外一个参数提供给它)
现在,应用改变:
$ ./manage.py migrate southtut Running migrations for southtut: - Migrating forwards to 0002_auto__add_field_knight_dances_whenever_able. > southtut:0002_auto__add_field_knight_dances_whenever_able - Loading initial data for southtut.
随即,我们的新列就创建好了。回到交互界面并检查,你能将能够添加骑士,它们会在可能的时间里跳舞。
转换已存在的apps
有时,特别是在把South引用进一个项目时,你想在已存在的apps中使用它,其中一种情况是表已经被创建好了。
这种情况和全新的app在添加迁移时是不同的,你应当阅读转换一个app以获得更多的操作信息。
在你愉快的完成South的基本使用之后,请移步 Part2:高级改变。