2010-09-20 130 views
0

我更喜欢在Django中手动迁移我的表。因为使用自动化工具将我置于一个我看不到影响的地方。有了影响,我的意思是数据库与我的模型同步所需的时间。下面是一个简单的例子:django手动数据库迁移

class User(models.Model): 
    first_name = CharField(..) 

比方说,我想补充一点:

class User(models.Model): 
     first_name = CharField(..) 
     last_name = CharField(..) 

我会按照我的生产服务器中的下列步骤操作:

  1. 禁用网站的流量。
  2. 手动连接到您的数据库服务器,让我们说MySQL并向名为last_name的用户表添加一个字段(确保它与为新模型生成的SQL同步)
  3. 更新您的模型。
  4. 上传新文件,重新启动流量。

我对这个方案的两个问题:

  1. 这是为在Django手动分贝迁移首选/可以接受的方式?
  2. 如果我只是用SQL手动向用户表添加一个具有特定默认值的字段,但不更新模型,我还会得到DatabaseIntegrity异常吗?

由于提前,

回答

0

这是Django手动数据库迁移的首选/可接受的方式吗?

我会回答没有。正如@Mike所说,Django拥有一个可靠和相当通用的迁移工具生态系统,其中最突出的是南部。 @迈克的答案有详细的权利。

要回答你的第二个问题:

如果我只是一个特定的默认值由SQL手动添加一个字段,用户表,但不更新模型,将我仍然得到DatabaseIntegrity异常?

不可以。您的模型将继续正常工作。当然,如果你想用Django的ORM对新字段做些什么,你最好将它们添加到模型类中。

这样做的副作用是您可以通过选择选择要在模型中使用的字段来迁移遗留数据库表。

7

与所有的架构迁移工具,如south,也有明确的定义你的模型是如何被迁移的方式。使用工具如这个的好处是:

  • 你的迁移存储在你的版本控制系统
  • 有文件规定的程序回滚架构迁移
  • 如果其他开发商加入你的项目,你可以将该人员引用到南方文档中,而不是解释您自己的hacky解决方案来记录模式迁移。

我想我应该强调一点的位置:虽然南方有自动迁移工具,你不必使用自动迁移,如果你正在使用南

+0

+1使用南... – hughdbrown 2010-09-20 16:22:30