2013-12-12 42 views
3

我用GAE實驗了一下,但現在我遇到了問題。首先,我在datastore中儲存了一些東西,其中NewIncompleteKey。 所以有這個問題。我的網站發送時間戳(我將它們作爲「ID」處理)到後端。我解析然後想從datastore中刪除它們。 我以爲我可以做到這一點。KeysOnly函數不返回鍵

type Food struct{ 
    Id int64 
    Course string 
    Name string 
    Date string 
    Price float64 
} 

...Some Code... 

func deleteEntries(mealsID []string, r *http.Request) int{ 
    // Get context from 
    c := appengine.NewContext(r); 


    for _,id := range mealsID{ 
     var key *datastore.Key = nil 
     q := datastore.NewQuery("Meal").Ancestor(mealStoreKey(c)).Filter("Course =", "dessert").KeysOnly() 
     _, err := q.GetAll(c, key) 
     if err != nil{ 
      return 0 
     } 
     log.Printf("Here the keys: %T %v ", key, key) 
     log.Printf("%v ", id) 
     e := datastore.Delete(c, key) 
     if e != nil{ 
      return 33  
     }  
    } 

    return len(mealsID) 
} 

但它不起作用,因爲我在datastore.Delete()函數得到一個錯誤。任何人的想法?

編輯:

第一部分:

keys, err := q.GetAll(c, nil) 
    … 
    err = datastore.DeleteMulti(c, keys) 

感謝戴夫。

第二部分:

我傳遞了一個String作爲篩選vaule到查詢,但它必須是一個相同的Int64作爲數據存儲。請注意我的自我:您還必須將相同類型的var傳遞給查詢。

func deleteEntries(mealsID []string, r *http.Request) int{ 
// Get context from 
c := appengine.NewContext(r); 


for _,id := range mealsID{ 
    ID,_ := strconv.Atoi(id) 
    q:= datastore.NewQuery("Meal").Ancestor(mealStoreKey(c)).Filter("Id =", ID).KeysOnly() 
    keys, err := q.GetAll(c, nil) 
    if err != nil{ 
     return 0 
    } 
    log.Printf("ID: %v ", id) 
    log.Printf("Keys: %v ", keys) 
    e := datastore.DeleteMulti(c, keys) 
    if e != nil{ 
     log.Printf("%v ", e) 
      return 0  
    }  
} 

return len(mealsID) 
} 
+0

什麼是錯誤? – yaccz

回答

4

的關鍵是從GetAll返回。所以,你應該寫改爲:

keys, err := q.GetAll(c, nil) 
… 
err = datastore.DeleteMulti(c, keys) 

GetAll忽略dst參數僅供鍵,請求 - datastore reference。所以,在上面的例子中,key仍然會被設置爲nil,這將解釋錯誤。

+0

謝謝戴夫,這是問題的一部分。我編輯我的帖子的解決方案。 – loose11