Django on Probation - WBowam/wbowam.github.com GitHub Wiki

Date: 2014-09-07
Title: 试用 Django 1.7
Tags: Django
Category: It

首先感谢django团队,在这一版本里django自身提供了数据迁移功能——migration

数据迁移

修改Model后可以在不影响现有数据的前提下重建表结构。

以往的解决方案是South(于是South成为了django必备的,最受欢迎的应用。)

原理

django的migration功能,类似与South的migration功能。

首先,创建app:
python manage.py startapp myblog
##1.7版django这一步时会创建一个migrations/目录
##settings.py
INSTALLED_APPS =(
    ####
    'myblog',
)  
##models.py
class Article(models.Model):
    title = models.CharField(max_length=18, null=True)
生成数据表

(不再有syncdb)

python manage.py makemigrations myblog

运行结果如下

Migrations for ‘myblog’:
  0001_initial.py:
    - Create model Article

看看生成了哪些文件

ls myblog/migrations/
__init__.py 0001_initial.py

修改models,添加一个author属性

class Article(models.Model):
    title = models.CharField(max_length=18, null=True)
    author = models.OneToOneField(User, null=True)
生成数据表(修改后)
python manage.py makemigrations myblog
##运行结果
Migrations for ‘myblog’:
  0002_article_author.py:
    - Add field author to article

我们来看看他重新生成数据表时干了些什么

  • 从上一个migration中获取之前的Model列表,写到set中.
  • 获取现有的model列表,写入set中。
  • 遍历这两个set的差集,获取差集Model中所有的field,如果field的定义相同,就询问用户是否是一个rename的model,否则视为创建。

数据迁移(migrate)

python manage.py migrate myblog


That's all 以上是个人对migration的理解,求纠错和指点~~