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