我刚刚开始使用Go运行时开发一个GAE应用程序,到目前为止,这是一种乐趣。但是,我遇到了以下挫折:
我利用数据存储区提供的灵活性,通过使用相同的实体名称(“Item”)保存具有不同属性的多个不同结构。 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
我得到了这个:
[]