如何在Google App Engine数据存储区中添加动态属性

杰森

我想做类似Python在应用程序引擎上支持Expando模型的事情

有时您不想提前声明属性。特殊的模型子类Expando更改其实体的行为,以便将分配的所有属性(只要它不以下划线开头)都保存到数据存储区。

如何在Go中执行此操作?

icza

事先注意:

有2个API。具有导入路径的那个appengine/datastore使用通道作为参数。具有导入路径的另一个google.golang.org/appengine/datastore使用切片。根据您的情况调整以下示例。有关详细信息,请参见此问题:如何正确导入Golang appengine?


具有动态属性的实体的关键是PropertyLoadSaver接口。通过实现此接口,您可以在保存时动态地构造要保存的实体的属性。

同样,不必自己执行此操作,Go AppEngine平台提供了一种PropertyList类型,类型基本上是属性列表(切片),Property并且也可以实现PropertyLoadSaver

因此Go中的Expando模型为PropertyList只需添加您希望实体拥有的属性,然后保存该PropertyList值即可。

这是一个例子:

c := appengine.NewContext(r)

props := datastore.PropertyList{
    datastore.Property{Name: "time", Value: time.Now()},
    datastore.Property{Name: "email", Value: "[email protected]"},
}

k := datastore.NewIncompleteKey(c, "DynEntity", nil)
key, err := datastore.Put(c, k, &props)
c.Infof("%v %v", key, err)

本示例将保存一个"DynEntity"具有2个动态属性的实体"time""email"

由于PropertyList类型是切片,因此您还可以使用内置append()函数为其添加属性,因此也可以props像这样进行初始化

var props datastore.PropertyList
props = append(props, datastore.Property{Name:"time", Value: time.Now()})
props = append(props, datastore.Property{Name:"email", Value: "[email protected]"})

map变成动态实体

PropertyLoadSaver界面并不复杂,我们可以实现它自己。在以下示例中,我在一个简单的自定义类型上实现了它map

type DynEnt map[string]interface{}

func (d *DynEnt) Load(props []datastore.Property) error {
    // Note: you might want to clear current values from the map or create a new map
    for _, p := range props {
        (*d)[p.Name] = p.Value
    }
    return nil
}

func (d *DynEnt) Save() (props []datastore.Property, err error) {
    for k, v := range *d {
        props = append(props, datastore.Property{Name: k, Value: v})
    }
    return
}

这是使用通道而不是切片的“旧”接口的实现的样子:

type DynEnt map[string]interface{}

func (d *DynEnt) Load(ch <-chan datastore.Property) error {
    // Note: you might want to clear current values from the map or create a new map
    for p := range ch { // Read until channel is closed
        (*d)[p.Name] = p.Value
    }
    return nil
}

func (d *DynEnt) Save(ch chan<- datastore.Property) error {
    defer close(ch) // Channel must be closed
    for k, v := range *d {
        ch <- datastore.Property{Name: k, Value: v}
    }
    return nil
}

现在,我们可以DynEnt像Go中的任何其他地图一样使用我们的类型,并且由于它实现了PropertyLoadSaver,因此可以将其保存为实体(并且可以将任何实体加载到其中):

c := appengine.NewContext(r)

d := DynEnt{"email": "[email protected]", "time": time.Now()}

k := datastore.NewIncompleteKey(c, "DynEntity", nil)
key, err := datastore.Put(c, k, &d)
c.Infof("%v %v", key, err)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何使用Java从Google App Engine数据存储区中的实体提取属性

来自分类Dev

在Google App Engine中,如何在更新SDK之后使开发数据存储区保持可用状态?

来自分类Dev

Google App Engine数据存储区按属性删除实体

来自分类Dev

如何在Google App Engine数据存储区中存储来自Android的用户特定数据。祖先与否?

来自分类Dev

如何在Google App Engine数据存储区中存储来自Android的用户特定数据。祖先与否?

来自分类Dev

如何使App Engine从数据存储区而不是内存缓存中检索属性值?

来自分类Dev

Google App Engine中的数据存储区与Cloud SQL

来自分类Dev

Google App Engine数据存储区中的多线程

来自分类Dev

如何在后端而不是App Engine数据存储区中创建与Google Cloud SQL连接的Android应用程序?

来自分类Dev

Google App Engine数据存储区的大表是如何设计的?

来自分类Dev

Google App Engine数据存储区如何获取Key <?>的实体

来自分类Dev

如何使用Google数据存储在Google App Engine中动态创建多个实体(Python)

来自分类Dev

如何从Google App Engine(Java)数据存储区中的子实体查询父实体?

来自分类Dev

如何在Google App Engine中查询属性的属性?

来自分类Dev

Google App Engine数据存储区查询返回陈旧数据

来自分类Dev

如何在身份验证期间防止Google App Engine /最终一致的数据存储区中的重复值

来自分类Dev

Google App Engine(Python)-数据存储区正在复制实体

来自分类Dev

Google App Engine数据存储区-密钥与标识符

来自分类Dev

Google App Engine NDB数据存储区的简单说明

来自分类Dev

查询所有实体的Google App Engine数据存储区

来自分类Dev

在Google App Engine上运行数据存储区查询

来自分类Dev

Google App Engine数据存储区获得财产的价值

来自分类Dev

在Google App Engine数据存储区上执行大型查询

来自分类Dev

Google App Engine数据存储区非复合索引

来自分类Dev

在Google App Engine数据存储区中搜索以前缀开头的字符串

来自分类Dev

覆盖Google App Engine- Java中的数据存储区实体

来自分类Dev

列出Google App Engine数据存储区中的所有实体时出现AttributeError

来自分类Dev

Google App Engine数据存储区关键字段中的“ name =“代表什么?

来自分类Dev

Google App Engine数据存储区中的索引和索引条目限制

Related 相关文章

  1. 1

    如何使用Java从Google App Engine数据存储区中的实体提取属性

  2. 2

    在Google App Engine中,如何在更新SDK之后使开发数据存储区保持可用状态?

  3. 3

    Google App Engine数据存储区按属性删除实体

  4. 4

    如何在Google App Engine数据存储区中存储来自Android的用户特定数据。祖先与否?

  5. 5

    如何在Google App Engine数据存储区中存储来自Android的用户特定数据。祖先与否?

  6. 6

    如何使App Engine从数据存储区而不是内存缓存中检索属性值?

  7. 7

    Google App Engine中的数据存储区与Cloud SQL

  8. 8

    Google App Engine数据存储区中的多线程

  9. 9

    如何在后端而不是App Engine数据存储区中创建与Google Cloud SQL连接的Android应用程序?

  10. 10

    Google App Engine数据存储区的大表是如何设计的?

  11. 11

    Google App Engine数据存储区如何获取Key <?>的实体

  12. 12

    如何使用Google数据存储在Google App Engine中动态创建多个实体(Python)

  13. 13

    如何从Google App Engine(Java)数据存储区中的子实体查询父实体?

  14. 14

    如何在Google App Engine中查询属性的属性?

  15. 15

    Google App Engine数据存储区查询返回陈旧数据

  16. 16

    如何在身份验证期间防止Google App Engine /最终一致的数据存储区中的重复值

  17. 17

    Google App Engine(Python)-数据存储区正在复制实体

  18. 18

    Google App Engine数据存储区-密钥与标识符

  19. 19

    Google App Engine NDB数据存储区的简单说明

  20. 20

    查询所有实体的Google App Engine数据存储区

  21. 21

    在Google App Engine上运行数据存储区查询

  22. 22

    Google App Engine数据存储区获得财产的价值

  23. 23

    在Google App Engine数据存储区上执行大型查询

  24. 24

    Google App Engine数据存储区非复合索引

  25. 25

    在Google App Engine数据存储区中搜索以前缀开头的字符串

  26. 26

    覆盖Google App Engine- Java中的数据存储区实体

  27. 27

    列出Google App Engine数据存储区中的所有实体时出现AttributeError

  28. 28

    Google App Engine数据存储区关键字段中的“ name =“代表什么?

  29. 29

    Google App Engine数据存储区中的索引和索引条目限制

热门标签

归档