【问题标题】:How to ignore errors in datastore.Query.GetAll()?如何忽略 datastore.Query.GetAll() 中的错误?
【发布时间】:2012-01-20 21:20:23
【问题描述】:

我刚开始使用 Go 运行时开发 GAE 应用程序,到目前为止,我很高兴。但是,我遇到了以下挫折:

我正在利用数据存储提供的灵活性,方法是使用相同的实体名称(“项目”)保存具有不同属性的多个不同结构。 Go language datastore reference 声明“传递的实际类型不必在 Get 和 Put 调用之间甚至在不同的 App Engine 请求之间匹配”,因为实体实际上只是一系列属性,因此可以存储在适当的容器类型中可以支持他们。

我需要查询存储在实体名称“Item”下的所有实体,并将它们一次性编码为 JSON。使用该实体属性的灵活性对我有利,可以将查询的实体存储到任意datastore.PropertyList,但是,当查询实体的属性不能被查询时,GetGetAll 函数返回ErrFieldMismatch 作为错误正确表示(也就是说,不兼容的类型,或者只是缺少值)。我保存的所有这些结构都是用户生成的,并且大多数值是可选的,因此将空值保存到数据存储中。使用空值保存这些结构时没有问题(数据存储灵活性再次出现),但在检索它们时会出现问题。

数据存储区 Go 文档中还指出,由 Get 方法的调用者决定由于空值返回的错误是可忽略的、可恢复的还是致命的。我想知道如何正确执行此操作,因为仅忽略错误是不够的,因为当查询导致此错误时,我的查询的目标结构 (datastore.PropertyList) 根本没有填充。

提前谢谢你,很抱歉这个冗长的问题。

更新:这里是一些代码

query := datastore.NewQuery("Item") // here I use some Filter calls, as well as a Limit call and an Order call
items := make([]datastore.PropertyList, 0)
_, err := query.GetAll(context, &items) // context has been obviously defined before
if err != nil {
    // something to handle the error, which in my case, it's printing it and setting the server status as 500
}

更新 2:这是一些输出

如果我使用make([]datastore.PropertyList, 0),我会得到:

datastore: invalid entity type

如果我使用make(datastore.PropertyList, 0),我会得到:

datastore: cannot load field "Foo" into a "datastore.Property": no such struct field

items 的这两种情况下(我认为可以丢弃第一个)我都明白了:

[]

【问题讨论】:

  • 你能分享一些代码来显示你当前如何调用GetAll 吗?
  • @proppy 完成,我用代码更新了问题。
  • 你能不能也显示fmt.Printf("{0}", err},以及你在物品中得到了什么?根据实现code.google.com/p/appengine-go/source/browse/appengine/…,即使加载失败,它也不应该停止加载属性。
  • 是的,我会更新 OP。另外,我刚刚发现如果我使用make([]datastore.PropertyList, 0),我会得到“无效的实体类型”,而如果我使用make(datastore.PropertyList, 0),我会得到ErrFieldMismatch
  • @proppy 完成,我更新了 OP。

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


【解决方案1】:

根据following post,go datastore 模块还不支持 PropertyList。

改为使用指向datastore.Map 切片的指针。

【讨论】:

  • 谢谢谢谢谢谢!这确实是问题所在!它是如此简单,我试图解决这个问题太深了。
  • 另请注意,您需要调用 make([]T, n) 来制作 T 的切片,not make(T, n)。
  • 这个问题是在 2011 年 11 月使用 SDK 1.6.0 实施 PropertyList 之后发布的。为了清楚起见(因为我在搜索中找到了这个答案):GetAll 将与 *[]PropertyList 一起使用但不是 *PropertyList。详情请见developers.google.com/appengine/docs/go/datastore/…
猜你喜欢
  • 2017-10-27
  • 2016-10-04
  • 1970-01-01
  • 2018-11-07
  • 1970-01-01
  • 2019-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多