gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 01:36:24 28 4
gpt4 key购买 nike

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

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

最佳答案

为了从保存的实体中删除属性,您必须先加载它,然后使用相同的键再次保存它,但不要删除您要删除的属性。如果你想从所有保存的实体(一种)中删除一个属性,你必须一个一个地加载和保存每个实体。 (当然您也可以使用其他方式,例如 Querydatastore.PutMulti() 来查询和保存多个实体。)

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

使用 2 个结构:

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

type Old struct {
Name string `datastore:"name"`
Removeme string `datastore:"removeme"`
}

type New struct {
Name string `datastore:"name"`
}

然后加载实体并重新保存(使用相同的 key ):

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
}

使用属性列表

或者您可以使用 datastore.PropertyList将任何实体加载到其中。

它基本上只是Property 的一部分。的:

type PropertyList []Property

从这个 slice 中移除你想删除的一个(或多个)属性,并用相同的 key 重新保存它。

基本上步骤是相同的​​:使用键加载实体,删除不需要的属性,然后重新保存它(使用相同的键)。

从 slice 中移除一个元素:

从索引 i 的 slice a 中删除元素:

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

关于google-app-engine - 如何使用 Go 从 Google App Engine 中的模型中删除字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32457629/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com