【问题标题】:Trouble with Queries/Datastore in Google App Engine - Go APIGoogle App Engine 中的查询/数据存储问题 - Go API
【发布时间】:2012-09-07 00:09:23
【问题描述】:

我正在使用 Go API 使用 Google App Engine,尽管我已经尝试了一切,但我无法让 Queries 返回数据存储区中的数据。我可以看到Put() 按预期工作,并且通过检查dev_appserver.py 提供的管理控制台,这些实体是可列出/可访问的

我存储的结构是这样定义的:

type TweetData struct {
    Id int64 `datastore:",noindex" json:"id"`
    Text string `datastore:",noindex" json:"text"`
    Screen_name string `json:"screen_name"`
}

我的查询电话是这样的:

func getDatastoreTweets(c appengine.Context, twitterUser string) []*TweetData {
    q := datastore.NewQuery("TweetData").Filter("Screen_name =", twitterUser).Order("-Id").Limit(10)

    var oldTweets []*TweetData
    if _, err := q.GetAll(c, &oldTweets); err != nil {
        fmt.Printf("Getall had non-nil error! %v\n", err)
    }   

    return oldTweets
}

对于这个查询,err 永远不会是非零,但总是返回 0 个结果,即使控制台告诉我有很多结果。在 SDK 提供的留言簿示例之后,我也尝试不使用 Filter 调用,但无济于事。

如果是键问题(如果我理解正确的话不太可能,因为我正在查询一个属性),对Put 的调用如下:

// tweetData passed in via parameter...
key := datastore.NewIncompleteKey(c, "TweetData", nil)
_, err := datastore.Put(c, key, &tweetData)

任何帮助将不胜感激,谢谢! ^_^

【问题讨论】:

  • 请注意,您不一定需要将指向[]*TweetData 的指针传递给GetAll,指向[]TweetData 的指针也可以正常工作。

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


【解决方案1】:

查询要求按Id desc 排序,而索引字段未编入索引,您应该:

  • 将 TweetData 注释重写为索引 Id 字段:

Id int64 `json:"id"`

  • 删除查询的 Order 子句:

q := datastore.NewQuery("TweetData").Filter("Screen_name =", twitterUser).Limit(10)

【讨论】:

  • 谢谢!我忘了更新问题,但发现这是答案。我希望索引只在过滤阶段很重要,而不是它已经收到的结果的排序......好吧,我们知道他们对假设的看法:-p
  • 是的,每次需要执行依赖于实体属性值的查询操作时都需要索引。
猜你喜欢
  • 1970-01-01
  • 2013-05-17
  • 1970-01-01
  • 1970-01-01
  • 2015-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-05
相关资源
最近更新 更多