2014-10-27 41 views
4

使谷歌的App Engine數據存儲的關鍵,我傳遞一個實體「ID」爲串中的URL,例如:從字符串

..../foo/234565 

我想使用的ID在下面的查詢:

//...i hace some code that gets stringId from the URL, and I verified that it works 
stringId = .... 
theKey, err := datastore.DecodeKey(stringId) 
q := datastore.NewQuery("Foo").Filter("__key__ =", theKey) 

我得到的錯誤:

proto: can't skip unknown wire type 7 for datastore.Reference 

是否有轉換的StringID簡單的方式變成了 「鑰匙」?

+0

方面評論:數據存儲查詢看起來很奇怪:你可以在一個鍵上使用'datastore.Get()'。 – dyoo 2014-10-27 18:38:27

+0

ID是從哪裏來的?它是否來自https://cloud.google.com/appengine/docs/go/datastore/reference#Key.Encode? – dyoo 2014-10-27 18:39:41

+1

要非常清楚:'datastore.DecodeKey()'只適用於'Key.Encode()'生成的值。從您向我們展示給我們的內容看來,您剛剛插入了包含實體名稱,斜槓和ID的字符串值,希望它能夠解碼。但根據文檔,它不應該是這樣的:'datastore.DecodeKey()'需要一個專用於'Key.Encode()'的專用序列化格式。 – dyoo 2014-10-27 18:53:30

回答

3
c := appengine.NewContext(r) 
//Retrieve the entity ID from the submitted form. Convert to an int64 
entity_id := r.FormValue("entity_id") 
entity_id_int, err := strconv.ParseInt(entity_id, 10, 64) 
if err != nil { 
    fmt.Fprint(w, "Unable to parse key") 
    return; 
} 
//We manufacture a datastore key based on the Kind and the 
//entity ID (passed to us via the HTTP request parameter. 
key := datastore.NewKey(c, kind, "", entity_id_int, nil) 
//Load the Entity this key represents. 
//We have to state the variable first, then conduct the Get operation 
//so the datastore understands the struct representing the entity. 
var entity CustomStruct 
datastore.Get(c, key, &entity) 
+0

你也應該在這個答案中解釋爲什麼你之前嘗試過的東西沒有工作;否則,在原始方法破裂的情況下,爲什麼這種方法可行,沒有任何內容。 – dyoo 2014-10-27 19:03:00

+0

我不知道我爲什麼試圖做不到,但我認爲你在上面的評論中回答了這個問題,我非常感謝!你是對的,我只使用一個簡單的字符串,而不是由Key.Encode() – bmw0128 2014-10-27 19:36:38

+0

Yup產生的值,這就是我所懷疑的。我很高興你解決了你的問題!如果你能將這種理解融入到你的答案中,那麼答案就會更好。它會幫助別人犯同樣的錯誤。如果您沒有時間,請告訴我們,並且有人可以在答案的解釋性文字中進行編輯。 – dyoo 2014-10-27 19:58:19