如何使用 Go 从 Google App Engine 中的模型中删除字段?

How do I remove a field from a model in Google App Engine with Go?

Python delattr 或 Java 的 Go 等价物是什么:Entity.removeProperty

我正在尝试按照此处所述从数据存储中删除 属性: removing deleted properties from the datastore

要从保存的实体中删除 属性,您必须先加载它,然后使用相同的密钥再次保存它,但不要删除要删除的 属性。如果你想从所有保存的实体(一种)中删除 属性,你必须逐个加载和保存每个实体。 (当然你也可以使用Query's and datastore.PutMulti()等其他方式来查询和保存多个实体。)

您可以通过两种基本方式从保存的实体中删除 属性:

使用 2 个结构:

您可以使用 2 个结构:您的 old 模型和 new 模型(没有要删除的 属性 ):

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 的一部分:

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 从切片中删除多个元素时要小心。结果可能出乎意料,因为当您删除一个元素时,所有后续元素都会移动,您可能会跳过一个元素。有关详细信息,请参阅