代码之家  ›  专栏  ›  技术社区  ›  Klaus Byskov Pedersen

谷歌应用引擎模型类是如何存储的?

  •  5
  • Klaus Byskov Pedersen  · 技术社区  · 15 年前

    我不知道这些物品是怎么储存的。假设我有一个类定义如下:

    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 回复  |  直到 15 年前
        1
  •  10
  •   David Underhill    15 年前

    实体以protobuf表示形式存储在数据存储区中(包括其键,其中包括应用程序ID和实体的类型)。这个 Life of a Datastore Write 本文将更详细地讨论实体的表示以及它们是如何写入数据存储的。有关更详细的信息,请参阅本系列中的其余文章。

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

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

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

        2
  •  3
  •   Robert Kluin    15 年前

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

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

    db.model_to_protobuf(your_entity)
    

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

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