2

我有一个现有类模型的项目

class Disability(models.Model):
    child = models.ForeignKey(Child,verbose_name=_("Child"))

但是随着最近的架构变化,我必须将其修改为

class Disability(models.Model):
    child = models.ManyToManyField(Child,verbose_name=_("Child"))

现在对于这个新的变化..(即使我必须为新的数据库修改现有的数据库)我想数据迁移是最好的方法,而不是手动进行。

我参考了这个在线文档

http://south.readthedocs.org/en/latest/commands.html#commands-datamigration

但它很少涉及数据迁移。以及有关架构迁移的更多信息。

问题 1。如果我进行架构迁移,这会让我失去属于那个旧模型的所有以前的数据。

问题2 。即使我正在尝试模式迁移,它也在问这个......

 (rats)rats@Inspiron:~/profoundis/kenyakids$ ./manage.py schemamigration web --auto 
  ? The field 'Disability.child' does not have a default specified, yet is NOT NULL.
  ? Since you are removing this field, you MUST specify a default
  ? value to use for existing rows. Would you like to:
  ?  1. Quit now, and add a default to the field in models.py
  ?  2. Specify a one-off value to use for existing columns now
  ?  3. Disable the backwards migration by raising an exception.
  ? Please select a choice: 1

谁能解释一下模式和数据迁移之间的概念和区别,以及如何分别实现这一点。

4

2 回答 2

3

架构和数据迁移不是您可以用来修改表结构的不同选项。它们是完全不同的东西。当然,数据迁移在 South docs 中有完整的描述

在这里,数据迁移对您没有帮助,因为您需要修改架构。South 和其他迁移系统的全部意义在于它们允许您在不丢失数据的情况下执行此操作。

于 2013-01-14T13:22:51.223 回答
1
  1. South 将尝试通过将您的表数据移动到临时表(我可能错了)来进行事务,然后重组表并尝试将原始数据添加到新结构中。像这样:

old_table -> 克隆 -> tmp_table

旧表->重组

tmp_table.data -> 表

South 将查看字段类型。如果有很大的变化,它会问该怎么做。例如,将文本字段更改为 int 字段将很难转换:)

  1. 当您删除字段时,您可能仍希望能够转换回旧结构,因此 south 需要一些默认数据才能创建具有旧结构的表。

移动数据始终是一个问题,因为您可能会更改表结构和字段类型。例如,您将如何手动处理从 Char(max_length=100) 到 Char(max_length=50) 的数据?

最好的建议是保持良好的备份。还可以利用 djangos 固定装置。您可以保存不同数据结构的固定装置以及南迁移。

South 将以与 syncdb 相同的方式加载 initial_data 文件,但它会在每个成功的迁移过程结束时加载它们

http://south.readthedocs.org/en/latest/commands.html#initial-data-and-post-syncdb

于 2013-01-14T14:03:20.733 回答