我目前正在使用 Django 进化来管理我的产品的数据库进化。它并不完美,但我已经学会忍受它的缺陷。例如,在移出新模式之前,我总是必须复制我的生产数据库进行测试,因为“evolve”命令不能总是演化在几次小型迁移中更改的数据库(在测试中我做了 A->B->C,但 A->C 不会正确进化。)
South会解决所有这些问题吗?学习新工具值得付出努力吗?
我目前正在使用 Django 进化来管理我的产品的数据库进化。它并不完美,但我已经学会忍受它的缺陷。例如,在移出新模式之前,我总是必须复制我的生产数据库进行测试,因为“evolve”命令不能总是演化在几次小型迁移中更改的数据库(在测试中我做了 A->B->C,但 A->C 不会正确进化。)
South会解决所有这些问题吗?学习新工具值得付出努力吗?
我刚开始使用 South,我 100% 都在使用它。它也是少数仍在积极开发中的产品之一。
South 应该能够正确处理您在上面描述的问题。对于数据库的每次更改,它都会创建一个具有 2 种方法“向前”和“向后”的文件。这是一个自动生成的迁移示例:
# > 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 以使生产数据库加速。
如果您已经继续并自己进行了更改,您可以告诉 South 运行“假”迁移。通常,迁移系统会非常适合,但这使得灵活控制您的数据库变得非常容易。
manage.py migrate [appname] --fake
如果您需要进行一些自定义操作,例如将一列中的数据复制到另一列,因为迁移文件只是 python 文件,因此很容易修改前进/后退函数。
在已经部署应用程序之后迁移到 South 相当容易。最新版本 0.6 实际上包含了一个命令。
manage.py convert_ to _south [appname]
当然,我怎么会忘记,我最喜欢的功能是自动生成迁移文件
manage.py schemamigration [appname] [description] --auto
我想我应该为我在开始使用 South 时所犯的错误添加一些提示。并非一切都是 100% 直观的。
在开发数据库上运行 convert_to_south 命令后,不要忘记migrate --fake
在生产数据库上运行,否则 South 会认为它已经过时了。
如果您正在创建一个新应用程序,则使用该--initial
标志
停止使用 manage.py syncdb。真的。
编辑模型是一个 3 步过程——
1.) 保存模型更改
2.) 运行schemamigration --auto
3.) 运行migrate
以实际提交对数据库的更改
编辑—— 为了澄清下面的评论,核心贡献者正式投票决定不包含在 1.2 版中。部分原因是《南方》的作者要求不要将其包括在内。尽管如此,South 还是有很多社区支持,一些可重复使用的应用程序制造商开始在他们的应用程序中包含 South 迁移。
编辑#2——我做了一些更新以反映当前 South 主干版本的新 manage.py 命令结构。“startmigration”已根据您的操作分为“schemamigration”和“datamigration”。