django手动数据库迁移

时间:2010-09-20 15:28:16

标签: database django migration

我更喜欢在Django中手动迁移我的表。因为使用自动化工具会让我无法看到影响。有了影响,我的意思是db与我的模型同步所花费的时间。以下是一个简单的例子:

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

假设我想补充一下:

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

我将在生产服务器中执行以下步骤:

  1. 停用网站流量。
  2. 手动连接到您的数据库服务器,让我们说MySQL并在名为last_name的User表中添加一个字段(当然,确保它与为新模型生成的SQL同步。)
  3. 更新您的模型。
  4. 上传新文件,重启流量。
  5. 我对这个场景有两个问题:

    1. 这是Django中手动数据库迁移的首选/可接受方式吗?
    2. 如果我只是通过SQL手动将具有特定默认值的字段添加到User表中,但是不更新模型,我是否仍会获得DatabaseIntegrity异常?
    3. 提前致谢,

2 个答案:

答案 0 :(得分:7)

使用所有架构迁移工具(例如south),有一些方法可以明确定义模型的迁移方式。使用诸如此类工具的好处是:

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

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

答案 1 :(得分:0)

  

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

我会回答不。正如@Mike所说,Django拥有一个可靠且相当多功能的迁移工具生态系统,其中最突出的是南方。 @ Mike的答案有正确的细节。

回答你的第二个问题:

  

如果我只是通过SQL手动将具有特定默认值的字段添加到User表中,但是不更新模型,我是否还会获得DatabaseIntegrity异常?

没有。您的模型将继续正常运行。当然,如果您想使用Django的ORM对新字段进行某些操作,最好将它们添加到模型类中。

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