2017-10-08 104 views
1

需要关于如何追加在谷歌的云数据存储的实体信息。如何将实体添加到数据存储在Go郎

将函数总是用新值覆盖。

任何建议将有所帮助。

09-OCT-2017:

我用下面的代码,但还是更新实体,而不是附加的(其擦除旧&新的值进行更新,但我想保留这两个值)

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) 
} 
+0

什么是实体和输入?请张贴他们和你想要达到的目标。 – icza

+0

实体是结构&输入是字符串。 _type实体结构{ \t字符串值 } 输入:= r.URL.Query()获取( “输入”)_ – vindl

+0

什么你要 “追加”?你想实现什么? – icza

回答

1

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

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

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

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

所以,在你的榜样你的实体应该是这样的:

​​

当你加载现有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?

如果你遇到这个问题,你应该考虑的建模和存储不同格式的数据,例如保存在多个实体中,其中一个实体只存储与其所属的密钥相连的单个input

+0

感谢您的建议。双拇指向上。 – vindl

1

您应该:

  • 得到一个实体首先,
  • 然后更改值
  • 并在此之后更新数据存储中的实体。

请与文档咨询:https://cloud.google.com/datastore/docs/concepts/entities#updating_an_entity

要更新现有实体,修改以前检索到的实体 的属性,并将其存储使用密钥:

tx, err := client.NewTransaction(ctx) 
if err != nil { 
     log.Fatalf("client.NewTransaction: %v", err) 
} 
var task Task 
if err := tx.Get(taskKey, &task); err != nil { 
     log.Fatalf("tx.Get: %v", err) 
} 
task.Priority = 5 
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) 
} 
+0

我使用下面的代码。我只是好奇,为什么下面的代码不工作(追加).K:= datastore.NameKey( “实体”, “的StringID”,无) \t \t E:= {实体}输入 \t如果_,= ERR client.Put (ctx,k,&e); err!= nil { \t} – vindl

+0

我根据您的建议更新了查询,但仍然没有成功。 – vindl

相关问题