2013-07-03 51 views
0

的變化我已經一個模型是這樣的:SQL的模型結構

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() 

這意味着和自動增量mybase_ptr_id並在每個1類和class2的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. Reindex id下一個值。
  5. 添加field_a和field_b列。
  6. 匹配來自MyBase表的field_a,field_b值的對應值。
  7. 從mybase_ptr_id中刪除列。

我是否缺少任何有關此問題的重要問題?我想讀你的建議...

回答

2

通常我會建議使用南改變你的數據庫模型,它可以爲你自動處理很多事情。

但是,在保留數據的同時改變一些過於激烈的東西需要一些手動工作。

我認爲你的輪廓大多存在,儘管我不認爲你需要在以後轉換爲序列。我想你可以從一開始就創建一個序列號爲id的列。複製數據後,只需添加主鍵索引即可。

所以...我的建議是:

  1. 添加串行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
+0

謝謝你們的詳細步驟。我在第四節遇到問題。無法使id成爲PK,因爲mybase_ptr_id已經是PK ...所以更好的重命名id列添加了一個新的secuence,從MyBase表中的最大id開始,並將與mybase關聯的約束 – juanefren