0

我已经有这样的模型:

class MyBase(models.Model):
    field_a = models.IngetField()
    field_b = models.IngetField()

class Class1(MyBase):
    field_c = models.IngetField()

class Class2(MyBase):
    field_c = models.IngetField()

这意味着在每个 Class1 和 Class2 上自动增加 mybase_ptr_id 和 field_c 字段。

由于设计原因,我们希望将架构更改为:

class Class1(models.Model):
    field_a = models.IngetField()
    field_b = models.IngetField()
    field_c = models.IngetField()

class Class2(models.Model):
    field_a = models.IngetField()
    field_b = models.IngetField()
    field_c = models.IngetField()

相反,这需要一个自动增量 id 和字段 field_a、field_b、field_c(我猜是最常见的方法)。

是否有既定或推荐的方式来修改表的结构?我正在使用postgresql。

我想每个表的基本方法:

  1. 创建一个新的 id 列。
  2. 填写我在 mybase_ptr_id 上已有的相同信息。
  3. 将 id 转换为串行 NOT NULL PRIMARY KEY。
  4. 重新索引 id 下一个值。
  5. 添加 field_a 和 field_b 列。
  6. 匹配来自 MyBase 表的 field_a、field_b 值的对应项。
  7. 从 mybase_ptr_id 中删除列。

我是否错过了有关此的任何重要问题?我想看看你的推荐...

4

1 回答 1

2

一般来说,我会推荐使用 South 来改变你的数据库模型,它可以自动为你处理很多事情。

但是在保留数据的同时改变如此剧烈的事情将需要一些手动工作。

我认为您的大纲大部分都在那里,尽管我认为您以后不需要转换为串行。我认为您可以id从一开始就创建连续的专栏。复制数据后只需添加主键索引。

所以......我的建议:

  1. 添加 serial id, field_a 和 field_b 与 field_a 和 field_b 作为空字段。
  2. update table set id = mybase_ptr_id, field_a = other_table.field_a, ...
  3. 更新您的序列以开始select max(id) from table
  4. 制作id主键,其他字段不为空
  5. 删除 mybase_ptr_id
于 2013-07-03T23:48:03.747 回答