【问题标题】:Is it SAFELY possible to use a str(BlobKey) as datastore id?是否可以安全地使用 str(BlobKey) 作为数据存储 ID?
【发布时间】:2013-07-15 09:08:18
【问题描述】:

任务:实现全局、跨实体组 Blob 共享。

我需要一个具有 BlobInfo 或 BlobKey 的字符串表示形式的祖先组作为 BlobReference 对象的父组,以具有强一致性。所以我构造了一个虚拟祖先组,其中 blob-key 作为引用 DB-object 的父级 ...

br = BlobReferenece(id=some_id, parent = ndb.Key("MyBlobKey",str(blob))) 
br.put()

到目前为止,这在 SDK 中有效,但我担心这与 appengine 的文档路径相去甚远。

我之前的尝试未能使用 ndb.Key.from_old_key(blobinfo.key()) 将 blob-key 转换为 db-key。似乎没有合法的方法来获得对 BlobInfo 表的“db/ndb”引用(因为 BlobInfo 类提供了一个 db.Model-like 接口)。我在这里遗漏了什么吗?

【问题讨论】:

  • 只要字符串中的 blobinfo 键是有效的照片,为什么它会无效?
  • 但是不清楚你为什么要这样做。您需要多个子实体才能使其物有所值,因为我们没有父实体的任何实体根据定义都在其自己的实体组中
  • n 次 BlobReference 是父实体的子实体。确定有多少 BlobReferences 链接到单个 blob 的查询是在 blob 不再使用或删除最后一个 ref 后删除该 blob 所必需的 [query = BlobReference.query(ancestor=self.key.parent())]
  • 广告评论 1:使用 blobkey 的字符串表示作为父项的 id(不通过普通 DB 键)是一种非常奇怪的方法,但唯一允许此查询但没有最终一致性的方法问题。
  • 同意,您没有在原始帖子中说有多少实体共享祖先。

标签: google-app-engine python-2.7 app-engine-ndb


【解决方案1】:

似乎您的问题是询问您是否可以通过指定不存在的父级来创建某种“虚拟祖先组”。这是合法的,文档中提到父级实际上不需要存在。

https://developers.google.com/appengine/docs/python/datastore/entities#Python_Ancestor_paths

或者,如果您的 BlobReference 列表受到限制,那么将它们的列表存储在一个实体中可能会更容易且成本更低。您可以使该容器实体的密钥与 BlobKey 相同。然后通过按键获取该实体并对其进行修改,这样您就可以在没有最终一致性问题的情况下工作。它也比查询和修改索引实体更便宜。

【讨论】:

  • 我知道虚拟祖先组是可能的,但我不知道使用 blobkeys 作为 key-id 是否有任何后果,可能没有。将它们存储在模型列表中不允许对模型进行子类化以将一些有用的属性附加到引用实体。我不能真正限制引用,如果您在全球范围内共享 blob,则某些 blob 可能有 1000 个,其他只有一个。在任何情况下,您都可以复制 blob(这很难)并创建一个新的引用组。
【解决方案2】:

您对 API 的不同部分中“键”一词的各种用法感到困惑。 Blob 键与实体键没有任何共同之处。好消息是 BlobKey 实例的 str() 是一个正常的 base64 编码字符串,应该可以很好地用作 Key 对象的 ID 部分。您可以使用 BlobKey 构造函数从该 ID 字符串转到 BlobKey 实例。

【讨论】:

  • 这种方法的巧妙之处在于 blobkey = self.key.parent().id()。但是,我还发现仅从 BlobInfo.all().fetch(3, keys_only=True) 获取密钥可以检索 db-keys(!) 和 ndb.Key.from_old_key(blobs[0]) 有效。这是一个不一致的 API。这样你可能会删除 BlobInfo 实例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-26
  • 1970-01-01
  • 2012-05-06
  • 2018-02-19
  • 2012-02-01
  • 1970-01-01
相关资源
最近更新 更多