我用GAE
进行了一些实验,但现在我遇到了问题。首先,我将一些内容存储到datastore
,并使用NewIncompleteKey
。
所以有问题。我的网站向后端发送时间戳(我将其作为“ID”处理)。我解析然后想要从datastore
中删除它们。
我以为我能做到这一点。
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作为Filter 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 :(得分:4)
密钥从GetAll
返回。所以你应该写:
keys, err := q.GetAll(c, nil)
…
err = datastore.DeleteMulti(c, keys)
GetAll
会忽略仅限密钥请求的dst
参数 - datastore reference。因此,在上面的示例中,key
仍将设置为nil
,这解释了错误。