Google App Engine模型类是如何存储的?

时间:2010-11-17 19:02:50

标签: python google-app-engine google-cloud-datastore

我怀疑对象是如何存储的。假设我有一个类定义如下:

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

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

我的猜测是,数据存储中唯一存储的是some_number的名称/值/类型以及类的完全限定名称(SomeEntity)。但是,我没有偶然发现任何证实这一点的信息。

1)任何人都可以证实吗?

我想确认我可以更改(并添加/删除)方法,而不会以某种方式影响存储的数据。

2)此外,如果我向类中添加一个新属性会对现有对象产生什么影响(如果该属性有required=true,该怎么办?)

2 个答案:

答案 0 :(得分:10)

实体以protobuf表示形式存储在数据存储区中(包括其密钥 - 包括您的App ID和实体的种类)。 Life of a Datastore Write文章更多地讨论了实体的表示以及它们如何写入数据存储区。查看本系列的其余文章以获取更多详细信息。

1)方法与您实体存储的数据无关,因此您可以添加/删除/更改这些数据,而不会影响数据的表示。

2)数据存储区是无模式的(与典型的SQL数据库不同)。更改Model对数据存储区中的数据完全没有影响。检索现有实体时,如果缺少required字段,则会引发错误。或者,如果您不需要它并提供默认值,则默认值将用于缺少的字段。

如果您需要将旧模型迁移到新模型,您可能需要考虑使用appengine-mapreduce库迭代所有实体并单独迁移每个实体。阅读有关架构迁移的更多信息here

答案 1 :(得分:3)

它们存储为协议缓冲区。您可以在“How Entities and Indexes are Stored”文章中了解一些详细信息。

您可以看到实际存储的内容:

db.model_to_protobuf(your_entity)

添加/删除方法是安全的,只需要小心覆盖built-in方法。

如果添加所需的属性,请包含默认值。在您重新放置实体之前,不会更新现有实体。