KeysOnly函数不返回Keys

时间:2013-12-12 20:45:59

标签: google-app-engine go google-cloud-datastore

我用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)
}

1 个答案:

答案 0 :(得分:4)

密钥从GetAll返回。所以你应该写:

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

GetAll会忽略仅限密钥请求的dst参数 - datastore reference。因此,在上面的示例中,key仍将设置为nil,这解释了错误。