2013-07-15 46 views
0

任務:實現全局,跨實體組blob共享。是否可以安全地使用str(BlobKey)作爲數據存儲ID?

我需要一個具有BlobInfo或BlobKey的字符串表示形式的祖先組作爲BlobReference對象的父級具有較強的一致性。所以我構建一個虛擬的祖先組與BLOB鍵作爲參考DB-對象的父...

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

這工作在SDK,到目前爲止,但我很擔心,這是遙遠的documeted路徑appengine的。

我以前的嘗試未能使用ndb.Key.from_old_key(blobinfo.key())將blob-key轉換爲db-key。看起來沒有合法的方法來獲得對BlobInfo表的「db/ndb」引用(因爲BlobInfo類提供了一個類似於db.Model的接口)。我在這裏錯過了什麼嗎?

+0

只要字符串的blobinfo鍵是有效的照片,爲什麼它會失效? –

+0

但是不清楚你爲什麼這樣做。您需要多個子實體才能讓它值得一試,因爲我們沒有父母的任何實體在其實體組中定義爲 –

+0

n次BlobReference是父級的子實體。查詢確定有多少個BlobReferences鏈接到一個blob,在它不再被使用或者最後一個ref被刪除後刪除blob是必要的[query = BlobReference.query(ancestor = self.key.parent())] – cat

回答

0

看起來像你的問題是問你是否可以通過指定一個不存在的父親來創建某種「虛擬祖先組」。這是合法的,在文檔中提到父母實際上並不需要存在。

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

另外,如果您的BlobReferences的名單將是有限的,它可能會更容易,更便宜的只存儲一個實體內它們的列表。您使該容器實體的Key與BlobKey相同。然後通過密鑰獲取該實體並修改它可以讓您在沒有最終一致性問題的情況下工作。它也比查詢和修改索引實體更便宜。

+0

我知道虛擬祖先組是可能的,但我不知道是否有使用blobkeys作爲key-id的後果,可能沒有。將它們存儲在模型列表中不允許繼承模型以將一些有用的屬性附加到引用實體。如果您在全球共享Blob,我無法真正限制引用,有些Blob可能有1000個,其他只有一個。無論如何,你可以複製blob(這很難)並創建一個新的引用組。 – cat

0

在API的不同部分中,您聽起來對單詞「key」的各種用法感到困惑。 blob密鑰與實體密鑰沒有任何共同之處。好消息是BlobKey實例的str()是一個理性的base64編碼的字符串,應該可以很好地用作Key對象的ID部分。您可以使用BlobKey構造函數從該ID字符串到BlobKey實例。

+0

這種方法的光滑的東西是blobkey = self.key.parent()。id()。但是,我還發現僅從BlobInfo.all()獲取密鑰。fetch(3,keys_only = True)檢索db-keys(!)和ndb.Key.from_old_key(blobs [0])。這是一個不一致的API。 這樣你可能會刪除__BlobInfo__實例。 – cat

相關問題