2011-05-16 40 views
8

我有一個存儲在GAE數據存儲中的持久類。我已經從課程中刪除了其中一個屬性。此表中的新記錄顯示值<none>對於已刪除的屬性。但是有沒有辦法讓這個專欄完全從桌子上掉下來?如何刪除GAE數據存儲中的列(屬性)?

謝謝。

添加根據Moraes的建議下面「遷移」的代碼,但它沒有實現所期望的結果:

PersistenceManager pm = PMF.get().getPersistenceManager(); 
try { 
    Query q = pm.newQuery(UserLogin.class); 
    Collection<UserLogin> list = (Collection<UserLogin>) q.execute(); 

    Iterator<UserLogin> iter = list.iterator(); 
    while (iter.hasNext()) { 
     UserLogin obj = (UserLogin) iter.next(); 
     obj.setLoginDate(obj.getLoginDate()); 
    } 

    pm.makePersistentAll(list); 

} finally { 
    pm.close(); 
} 

回答

6

我發現在這條回答這個問題: http://code.google.com/appengine/articles/update_schema.html

從數據庫中刪除已刪除屬性

如果您從模型刪除一個屬性,你會發現,現有的實體仍然爲了真正清除舊數據,您需要循環訪問您的實體並從各個實體中刪除數據。

  • 確保您已從模型定義中刪除屬性。

  • 如果您的模型類繼承自db.Model,請暫時將其切換爲從db.Expando繼承。 (db.Model實例不能動態修改,這是我們下一步需要做的。)

  • 通過現有實體循環(如上所述)。對於每個實體,請使用delattr刪除廢棄的屬性,然後保存該實體。

  • 如果您的模型最初是從db.Model繼承的,請不要忘記在更新所有數據後將其更改回來。「

這裏是代碼的例子: http://sandrylogan.wordpress.com/2010/12/08/delattr/

5

有一個在數據存儲區無‘表’的概念。每個實體可以具有不遵循共同模式的任意屬性。唯一的「模式」在您的模型代碼中,並且當您更改模型時現有記錄不會自動更改。

因此,要從現有記錄中刪除屬性,您需要遍歷所有記錄並重新保存,而不使用該屬性。

+0

moraes - 感謝您的幫助。請參閱我的OP中的「遷移」代碼。我的UserLogin類是持久類,不需要的字段已從中刪除。但不知何故,我仍然在數據存儲中的舊條目下看到'。我錯過了什麼? – DFB 2011-05-16 13:55:42

+0

您需要調用pm.makePersistentAll()傳遞更改的實體,以保存它們並有效地排除不再存在的額外屬性。 – moraes 2011-05-16 14:40:15

+0

我添加了該方法的調用,但沒有區別。查看我的OP中更新的代碼。我仍然看到'已刪除的屬性的值。謝謝。 – DFB 2011-05-16 15:14:42

3

數據存儲區查看器從數據存儲區統計信息中獲取列的列表,這些列會定期更新。如果您已從每個擁有它的實體中刪除該列,請等待一兩天,數據存儲區查看器將停止顯示它。

7

如果您正在使用ndb(和你應該),你可以輕鬆地刪除它們從entity._properties刪除屬性:

for entity in MyModel.query(): 
    if 'old_property' in entity._values: 
     del entity._properties['old_property'] 
     del entity._values['old_property'] 
     entity.put() 

或者您可以通過使用asynchronousquery map

@ndb.tasklet 
def cleanup(entity): 
    if 'old_property' in entity._values: 
     del entity._properties['old_property'] 
     del entity._values['old_property'] 
     yield entity.put_async() 

MyModel.query().map(cleanup) 
+0

嘿,我認爲「刪除」應該是「刪除」,但這對我很好,謝謝。 – 2013-10-22 03:59:50

+0

@RyanBavetta謝謝,修復! – 2013-10-22 07:36:35