【问题标题】:How are Google App Engine model classes stored?Google App Engine 模型类是如何存储的?
【发布时间】:2010-11-17 19:02:50
【问题描述】:

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

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),现有对象会发生什么?

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      db.model_to_protobuf(your_entity)
      

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

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

      【讨论】:

        猜你喜欢
        • 2012-02-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-24
        • 2011-05-26
        相关资源
        最近更新 更多