如何忽略datastore.Query.GetAll()中的错误?

时间:2012-01-20 21:20:23

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

我刚刚开始使用Go运行时开发一个GAE应用程序,到目前为止,这是一种乐趣。但是,我遇到了以下挫折:

我利用数据存储区提供的灵活性,通过使用相同的实体名称(“Item”)保存具有不同属性的多个不同结构。 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我得到了这个:

[]

1 个答案:

答案 0 :(得分:1)

根据following post,go数据存储模块尚不支持PropertyList。

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