将许多PropertyList放入Google App Engine数据存储区(在Go中)并使用Query.GetAll再次加载它们

时间:2012-01-19 18:13:09

标签: google-app-engine go datastore

我将实体(作为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

3 个答案:

答案 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(查看“函数”部分中的“获取”方法),GetGetAll方法调用将在字段时返回ErrFieldMismatch“将被加载到与其存储的类型不同的类型,或在目标结构中缺少或未导出字段时。仅当dst是结构指针时才返回ErrFieldMismatch。“我最好的猜测是,因为您将其存储为具有未导出名称的PropertyList,并且由于数据存储区在其模型中是灵活的,因此它们将原始值视为未导出,因为它们是小写字母。

我目前遇到了同样的错误,但我设法将其追踪到由于某些空字段而导致。

如果这可以解决您的问题,请告诉我。