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

什么是围棋等价的Pythondelattr或Java: Entity.removeProperty



繁花如伊
浏览 229回答 1
1回答

FFIVE

为了从保存的实体中删除属性,您必须先加载它,然后使用相同的键再次保存它,但没有要删除的属性。如果您想从所有保存的实体(一种)中删除一个属性,您必须一个一个地加载和保存每个实体。(当然,您可以使用其他方式,例如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:]...)// ora = 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.从切片中删除多个元素时要小心。结果可能出乎意料,因为当您删除一个元素时,所有后续元素都将被移动,您可能会跳过一个元素。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go