gpt4 book ai didi

go - 如何在 Go Lang 中将实体附加到数据存储

转载 作者:IT王子 更新时间:2023-10-29 02:02:42 25 4
gpt4 key购买 nike

需要有关如何在 Google 云数据存储中附加实体的信息。

Put 函数总是被新值覆盖。

任何建议都会有所帮助。

2017 年 10 月 9 日:

我使用了下面的代码,但仍在更新实体而不是附加。(它删除旧值并更新为新值,但我想保留这两个值)

client, err := datastore.NewClient(ctx, projectID)
tx, err := client.NewTransaction(ctx)
if err != nil {
log.Fatalf("Failed to create client: %v", err)
}

fmt.Fprint(w, input)
taskKey := datastore.NameKey("Entity", "stringID", nil)
var task Entity
if err := tx.Get(taskKey, &task); err != nil {
log.Fatalf("tx.Get: %v", err)
}
task.Value = input
if _, err := tx.Put(taskKey, &task); err != nil {
log.Fatalf("tx.Put: %v", err)
}
if _, err := tx.Commit(); err != nil {
log.Fatalf("tx.Commit: %v", err)
}

最佳答案

只能有一个实例,只有一个实体由相同的数据存储键绑定(bind)/表示。

并且实体(绑定(bind)到一个键)只能被覆盖,不能逐渐更新/扩展/追加。

所以如果你已经保存了一个实体,要更新/修改它,你必须先加载它,然后修改内存中的实体,并将修改后的实体写出(保存)。此保存将覆盖数据存储中的现有实体。

如果要为某个属性存储多个值,则该属性的类型必须支持存储多个值。 Slices在 Go 中就是这样的类型。

因此在您的示例中,您的实体应如下所示:

type Entity struct {
Values []string
}

当您加载一个现有的 Entity 时,您必须将新值附加到它的 Values 字段,就像这样(在伪代码中):

e := ... // load existing entity
e.Values = append(e.Values, input) // Append new data to Values
// And now save Entity (e) with the same key

在代码中:

client, err := datastore.NewClient(ctx, projectID)
tx, err := client.NewTransaction(ctx)
if err != nil {
log.Fatalf("Failed to create client: %v", err)
}

fmt.Fprint(w, input)
taskKey := datastore.NameKey("Entity", "stringID", nil)
var task Entity
if err := tx.Get(taskKey, &task); err != nil {
log.Fatalf("tx.Get: %v", err)
}
task.Values = append(task.Values, input)
if _, err := tx.Put(taskKey, &task); err != nil {
log.Fatalf("tx.Put: %v", err)
}
if _, err := tx.Commit(); err != nil {
log.Fatalf("tx.Commit: %v", err)
}

如果您需要通过此 Values 属性进行索引,如果它包含许多值,您可能会遇到麻烦。有关详细信息,请参阅此可能的副本:App Engine Datastore: How to set multiple values on a property using golang?

如果您遇到这个问题,您应该考虑以不同的格式建模和存储您的数据,例如保存在多个实体中,其中一个实体将只存储一个输入,与它所属的键相关联。

关于go - 如何在 Go Lang 中将实体附加到数据存储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46634906/

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