了解Google App Engine密钥的问题

时间:2013-06-09 16:58:00

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

我在这里看GAE的数据存储示例,除此之外,这让我有点困惑。

def guestbook_key(guestbook_name=DEFAULT_GUESTBOOK_NAME):
    """Constructs a Datastore key for a Guestbook entity with guestbook_name."""
    return ndb.Key('Guestbook', guestbook_name)

我理解为什么我们需要钥匙,但为什么'留言簿'是必要的?是这样您可以查询数据存储区中的所有“留言板”对象吗?但是,如果您需要在数据存储区中搜索某种类型的对象,为什么不存在查询(类型(问候语)?)请说明您输入的是ndb.model?

此外,如果您感到慷慨,为什么要创建您正在存储的对象,您是否必须设置父级?

greeting = Greeting(parent=guestbook_key(guestbook_name))

2 个答案:

答案 0 :(得分:2)

这就是关键所在:由成对类型和ID组成的路径。关键在于确定它是什么类型。

我不明白你的第二个问题。您不必设置父级,但如果要设置父级,则只能在创建实体时执行此操作。

答案 1 :(得分:2)

首先: GAE数据存储区是所有GAE应用程序同时使用的一个大型分布式数据库。为了区分实体,GAE使用系统范围的密钥。密钥由以下内容组成:

  1. 您的应用程序名称(隐式设置,通过API不可见)
  2. 命名空间,通过Namespace API设置(如果未在代码中设置,则使用空名称空间)。
  3. 实体的种类。这只是一个字符串,与数据库级别的类型无关。数据存储是无模式的,因此没有类型。但是,基于语言的API(Java JDO / JPA / objectify,Python NDB)将其映射到类/对象。
  4. 父键(afaik,序列化内部键)。这用于建立实体组(定义交易范围)。
  5. 特定实体标识符:name(字符串)或ID(long)。它们在命名空间和种类(以及父键,如果已定义)中是唯一的 - see this以获取有关ID唯一性的更多信息。
  6. 请参阅Key methods(java)以查看密钥中实际存储的数据。

    第二:似乎GAE Python API不允许您在没有定义映射到实体类的类的情况下查询数据存储区(我不使用GAE Python,所以我可能错了)。 Java确实有一个low-level API,您无需映射到类即可使用。

    第三:您无需为实体定义父级。定义父级是一种定义实体组的方法,这在使用事务时很重要。见ancestor pathstransactions