0

我在这里查看用于数据存储的 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)

我明白为什么我们需要钥匙,但为什么需要“留言簿”?是否可以查询数据存储区中的所有“留言簿”对象?但是,如果您需要在数据存储中搜索一种对象类型,为什么没有 query(type(Greeting)?考虑到那是您要放入的 ndb.model?

另外,如果你感觉很慷慨,为什么在创建你存储的对象时,你必须设置父级?

greeting = Greeting(parent=guestbook_key(guestbook_name))
4

2 回答 2

2

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

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

请参阅Key 方法(java) 以查看密钥中实际存储的数据。

第二:似乎GAE Python API不允许您在不定义映射到实体类型的类的情况下查询Datastore(我不使用GAE Python,所以我可能错了)。Java 确实有一个低级 API,您可以在不映射到类的情况下使用它。

第三:您不需要为实体定义父级。定义父对象是定义实体组的一种方式,这在使用事务时很重要。查看祖先路径事务

于 2013-06-09T19:32:29.130 回答
2

这就是 key 的含义:由 kind 和 ID 对组成的路径。关键是确定它是什么类型。

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

于 2013-06-09T17:58:28.307 回答