目前使用Django“Evolution”,是否“南方”更好,值得转换?

我目前正在使用Django进化来pipe理我的产品的数据库演变。 这不是完美的,但我学会了忍受它的缺点。 例如,在移出一个新的模式之前,我总是必须拷贝我的生产数据库进行testing,因为“evolve”命令不能总是发展一个在几个小的迁移中发生了变化的数据库(在testing中我做了A-> B-> C,但是A-> C不会正确演变。)

南方将解决所有这些问题吗? 学习新工具是否值得?

我刚开始使用南方,我100%的销售。 这也是less数仍处于非常活跃发展阶段之一。

南方应该能够妥善处理上述问题。 对于db的每一个改变,它创build一个有两个方法“前进”和“后退”的文件。 以下是一个自动生成的迁移示例:

# > manage.py schemamigration issuetracker added-status-field --auto # 0004_added-status-field.py class Migration: def forwards(self, orm): # Adding field 'Issue.status' db.add_column('issuetracker_issue', 'status', orm['issuetracker.issue:status']) def backwards(self, orm): # Deleting field 'Issue.status' db.delete_column('issuetracker_issue', 'status') 

几个关于它的好东西….

  • 如果您愿意,South可以让您回滚到特定的迁移

  • 如果您的生产站点正在迁移0002,并且您的SVN提交为0004,那么South将执行0003然后0004以使生产数据库加速。

  • 如果你已经自己做了改变,你可以告诉南方去做一个“假”的移民。 通常情况下,迁移系统会引起一些困难,但是这使得对数据库的灵活控制变得非常简单。

    manage.py migrate [appname] --fake

  • 如果你需要定制一些东西,比如说把一列中的数据复制到另一列,因为迁移文件只是python文件,所以很容易修改向前/向后的函数。

  • 已经部署应用程序后迁移到南部相当容易。 最新版本0.6包含一个实际的命令。

    manage.py convert_ to _south [appname]

  • 当然,我怎么会忘记,我最喜欢的function是自动生成迁移文件

    manage.py schemamigration [appname] [description] --auto


陷阱

我想我应该补充一些关于南方入门时所犯的错误的提示。 并非一切都是100%直观的。

  • 在开发数据库上运行convert_to_south命令后,不要忘记在生产数据库上运行migrate --fake ,否则South会认为它已经过期。

  • 如果你正在创build一个新的应用程序,你可以使用--initial标志

  • 停止使用manage.py syncdb。 真。

  • 编辑模型是一个3步骤的过程 –

    1.)保存模型更改

    2.)运行schemamigration --auto

    3.)运行migrate到实际提交更改到数据库

编辑 –为了澄清下面的评论,南方正式投票的核心贡献者不包括在版本1.2。 这部分是因为南方的提交人曾经要求它不包括在内。 即使如此,南方还有很多社区支持,一些可重复使用的应用程序制造商正在开始将南迁移与他们的应用程序。

编辑#2 –我做了一些更新,以反映当前中继版本的南的新的manage.py命令结构。 根据你在做什么,“startmigration”已经被拆分为“schemamigration”和“datamigration”。