2017-10-08 49 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

相關問題