1 回答
TA贡献1797条经验 获得超6个赞
为了从保存的实体中删除属性,您必须先加载它,然后使用相同的键再次保存它,但没有要删除的属性。如果您想从所有保存的实体(一种)中删除一个属性,您必须一个一个地加载和保存每个实体。(当然,您可以使用其他方式,例如Query's 和datastore.PutMulti()来查询和保存多个实体。)
您基本上可以通过两种方式从保存的实体中删除属性:
使用 2 个结构:
您可以使用 2 个结构:旧模型和新模型(没有要删除的属性):
type Old struct {
Name string `datastore:"name"`
Removeme string `datastore:"removeme"`
}
type New struct {
Name string `datastore:"name"`
}
并加载实体并重新保存(使用相同的密钥):
c := appengine.NewContext(r)
// Constructing the key, for example:
k := datastore.NewKey(c, "Entity", "stringID", 0, nil)
e := new(Old)
if err = datastore.Get(c, key, e); err != nil {
// Datastore error.
return
}
e2 := New{e.Name}
if _, err = datastore.Put(c, k, &e2); err != nil {
// Datastore error
}
使用 PropertyList
或者您可以使用 将datastore.PropertyList任何实体加载到其中。
它基本上只是Property's 的一部分:
type PropertyList []Property
从此切片中删除要删除的属性(或多个属性),并使用相同的键重新保存它。
基本上步骤是一样的:用一个键加载一个实体,删除不需要的属性,然后重新保存它(使用相同的键)。
从切片中删除一个元素:
要从a索引处的切片中删除元素i:
a = append(a[:i], a[i+1:]...)
// or
a = a[:i+copy(a[i:], a[i+1:])]
所以基本上它看起来像这样:
c := appengine.NewContext(r)
// Constructing the key, for example:
k := datastore.NewKey(c, "Entity", "stringID", 0, nil)
e := datastore.PropertyList{}
if err = datastore.Get(c, key, &e); err != nil {
// Datastore error.
return
}
// Loop over the properties to find the one we want to remove:
for i, v := range e {
if v.Name == "removeme" {
// Found it!
e = append(e[:i], e[i+1:]...)
break
}
}
if _, err = datastore.Put(c, k, &e); err != nil {
// Datastore error
}
注意:使用for range.从切片中删除多个元素时要小心。结果可能出乎意料,因为当您删除一个元素时,所有后续元素都将被移动,您可能会跳过一个元素。
- 1 回答
- 0 关注
- 228 浏览
添加回答
举报