我目前正在研究在 Google App Engine 上运行的基于 golang http 的处理程序。
作为其中的一部分,我试图通过投影查询提取我感兴趣的所有值,查看给定类型的多个字段,目的是将每个实体加载存储在一个结构中反射(reflect)字段类型。
这是我的查询:
source := datastore.NewQuery("CacheEntry").Project("Campaign", "Creative", "Impressions", "Operator", "Publisher", "Slot").Limit(50)
不幸的是,我从中得到的只是空字符串(更糟糕的是,返回空字符串不会抛出任何类型的错误,所以我才刚刚发现它正在这样做)。
Google 的文档和错误报告在数据存储方面非常糟糕,因此没有太大帮助。我可以在 Google Cloud Console 的数据存储查看器上看到填充的字段 - 有些字段实际上是空的,但我至少应该返回一些数据。
我使用适当的指针设置在 for 循环中运行它:
for t := source.Run(ctx); ; {
_, err := t.Next(&x)
log.Println(count)
if err == datastore.Done {
log.Println("failed on Datastore:done, count \n")
log.Println(count)
break
}
if err != nil {
log.Println("failed on \n")
log.Println(count)
http.Error(w, err.Error(), http.StatusInternalServerError)
break
}
// fmt.Fprint(w, x.Campaign)
if &x != nil {
fmt.Fprintln(w, "Strings:\n")
fmt.Fprintln(w, x.Operator)
if x.Operator == "" {
fmt.Fprintln(w, "Campaign string is empty")
}
}
count = count + 1
'X' 是:
type Row struct {
Campaign string
Creative string
Impressions int
Operator string
Publisher string
Slot string
有什么地方出错了吗?
最佳答案
弄清楚了,结果是后台发生了一些问题:
- 无论出于何种原因,索引未被更新,并且表明此错误消息未通过管道传输到 Http 响应,因此查询未运行
- 清除此后,我没有意识到我撤回的结果包括大量具有空白属性值且缺乏任何排序的事件,因此它们实际上是在
.Limit(50)
被处理之前发生的任何事情达到...在那种情况下,查询正在运行,但我将空字符串返回解释为错误,而实际上它们是正确的,而不是来 self 预期的数据集部分 - 添加过滤器"<property> >", ""
修复了它
Datastore 非常需要比现有更好的反馈措施。与我合作过的许多类似数据库相比,它的反馈是不必要的。
关于google-app-engine - golang 数据存储投影查询从填充实体返回空字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37027226/