用于更改模型结构的SQL

时间:2013-07-03 23:32:23

标签: sql django postgresql

我已经有这样的模型:

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. 重新编码下一个值。
  5. 添加field_a和field_b列。
  6. 匹配来自MyBase表的field_a,field_b值的对应。
  7. 从mybase_ptr_id中删除列。
  8. 我是否遗漏了这方面的任何重要问题?我想看看你的推荐......

1 个答案:

答案 0 :(得分:2)

一般情况下,我建议使用South来更改数据库模型,它可以自动处理很多事情。

但是在保留数据的同时改变一些与此类似的东西需要一些手动工作。

我认为你的大纲主要在那里,虽然我认为你不需要稍后转换为序列。我认为您可以从头开始创建id列。只需在复制数据后添加主键索引。

所以...我的建议:

  1. 使用field_a和field_b作为空字段添加序列id,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. drop mybase_ptr_id