【发布时间】:2012-01-20 21:20:23
【问题描述】:
我刚开始使用 Go 运行时开发 GAE 应用程序,到目前为止,我很高兴。但是,我遇到了以下挫折:
我正在利用数据存储提供的灵活性,方法是使用相同的实体名称(“项目”)保存具有不同属性的多个不同结构。 Go language datastore reference 声明“传递的实际类型不必在 Get 和 Put 调用之间甚至在不同的 App Engine 请求之间匹配”,因为实体实际上只是一系列属性,因此可以存储在适当的容器类型中可以支持他们。
我需要查询存储在实体名称“Item”下的所有实体,并将它们一次性编码为 JSON。使用该实体属性的灵活性对我有利,可以将查询的实体存储到任意datastore.PropertyList,但是,当查询实体的属性不能被查询时,Get 和GetAll 函数返回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