为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
繁花如伊 2021-11-08 10:53:48
什么是围棋等价的Pythondelattr或Java: Entity.removeProperty?
查看完整描述

1 回答

?
FFIVE

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

查看完整回答
反对 回复 2021-11-08
  • 1 回答
  • 0 关注
  • 228 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信