2010-11-17 33 views
5

我很懷疑物體是如何存儲的。說我有這樣定義的類:Google App Engine模型類是如何存儲的?

class SomeEntity(db.Model): 
    some_number = db.IntegerProperty(required=True) 

    def calculate_something(self): 
     return self.some_number * 2 

我的猜測是,存儲在數據存儲中的唯一的事情就是與類(SomeEntity)的完全合格的名字聯繫在一起的名稱/值/類型的some_number。不過,我並未偶然發現任何證實這一點的信息。

1)任何人都可以證實這一點?

我想確認我可以更改(和添加/刪除)方法,而不會影響存儲的數據。

2)此外,如果向類中添加新屬性(以及如果該屬性具有required=true),現有對象會發生什麼?

回答

10

實體以protobuf表示形式存儲在數據存儲區中(包括其關鍵字 - 包括您的應用程序ID和實體的Kind)。文章更多地討論了實體的表示以及它們如何寫入數據存儲。查看本系列文章的其餘部分以獲取更多詳細信息。

1)方法不會影響存儲在實體中的數據,因此您可以添加/刪除/更改這些數據而不影響數據的表示。

2)數據存儲是無模式的(與典型的SQL數據庫不同)。更改您的Model完全不會影響數據存儲區中的數據。當您檢索現有實體時,如果缺少required字段,則會引發錯誤。或者,如果您不要求並提供默認值,那麼缺省字段將使用默認值。

如果您需要將舊模型遷移到新模型,則可能需要考慮使用appengine-mapreduce庫來遍歷所有實體並分別遷移每個實體。詳細瞭解模式遷移here

+0

+1非常感謝David。這正是我需要的信息。 – 2010-11-17 19:15:26

3

它們被存儲爲協議緩衝區。您可以閱讀「How Entities and Indexes are Stored」文章中的一些詳細信息。

你可以看到什麼是真正與存儲:

db.model_to_protobuf(your_entity) 

它是安全的添加/刪除方法,只是要小心覆蓋built-in方法。

如果添加了所需的屬性,請包含默認值。在您重新放置實體之前,現有實體不會更新。

+0

+1謝謝羅伯特。看起來像一篇有趣的文章。 – 2010-11-17 19:23:53

相關問題