我将实体(作为datastore.PropertyList
)放入数据存储区,如下所示:
// save one
var plist datastore.PropertyList = make(datastore.PropertyList, 3)
plist = append(plist, datastore.Property { "name", "Mat", false, false })
plist = append(plist, datastore.Property { "age", "29", false, false })
plist = append(plist, datastore.Property { "location", "London", false, false })
key := datastore.NewIncompleteKey(context, "Record", nil)
datastore.Put(context, key, &plist)
// save another one
var plist datastore.PropertyList = make(datastore.PropertyList, 3)
plist = append(plist, datastore.Property { "name", "Laurie", false, false })
plist = append(plist, datastore.Property { "age", "27", false, false })
plist = append(plist, datastore.Property { "location", "London", false, false })
key := datastore.NewIncompleteKey(context, "Record", nil)
datastore.Put(context, key, &plist)
一切正常(尽管上面的代码现在更像伪代码)。我可以单独加载它们,datastore.PropertyList
随每个字段一起显示为datastore.Property
。
但是,当我尝试使用Query
检索其中的许多内容时,它会失败:
query := datastore.NewQuery("Record")
plists := make(datastore.PropertyList, 0, 10)
keys, err := query.GetAll(context, &plists)
我收到以下错误:
datastore: cannot load field "age" into a "datastore.Property": no such struct field
它似乎没有抱怨Name
,因为它恰好是datastore.Property
的有效属性,因此如何让它按预期加载项目,每个项目都在{ {1}}是plists
而不是datastore.PropertyList
?
答案 0 :(得分:3)
我更改了实现以使用PropertyLoadSaver
接口 - 您可以看到它在我们用于数据存储的新Active Record样式包装器中运行良好:http://github.com/matryer/gae-records(请参阅record.go
类型的{{1 }和Load
方法)
答案 1 :(得分:2)
GetAll在给定的上下文中运行查询,并返回与该查询匹配的所有键,以及将值附加到dst。 dst必须是指向切片结构,结构指针或地图的指针。如果q是“仅密钥”查询,则GetAll将忽略dst并仅返回密钥。
根据following post,go数据存储模块尚不支持PropertyList。
使用指向datastore.Map切片的指针。
另请注意,您需要拨打make([]T, n)
来制作一片T
,而不是make(T, n)
答案 2 :(得分:2)
尝试使用大写字母编写字段名称,例如,而不是age
,请写Age
。这告诉Go您的字段已导出(它类似于公共变量的概念,尽管它比这更远)。
根据Go datastore documentation(查看“函数”部分中的“获取”方法),Get
或GetAll
方法调用将在字段时返回ErrFieldMismatch
“将被加载到与其存储的类型不同的类型,或在目标结构中缺少或未导出字段时。仅当dst是结构指针时才返回ErrFieldMismatch。“我最好的猜测是,因为您将其存储为具有未导出名称的PropertyList
,并且由于数据存储区在其模型中是灵活的,因此它们将原始值视为未导出,因为它们是小写字母。
我目前遇到了同样的错误,但我设法将其追踪到由于某些空字段而导致。
如果这可以解决您的问题,请告诉我。