2017-10-08 1 views
1

Benötigen Sie Informationen zum Anhängen einer Entität in den Google Cloud-Datenspeicher.So hängen Sie eine Entität an einen Datenspeicher in Go Lang an

Put-Funktion wird immer mit neuen Werten überschrieben.

Alle Vorschläge wären hilfreich.

09-OCT-2017:

ich unten Code verwendet, aber immer noch Einheit statt Anhängen zu aktualisieren (die alten & mit neuem Wert aktualisiert zu löschen, aber ich mag beiden Werte behalten)

.
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

Was ist "Entity" und "Input"? Bitte poste sie und was du genau erreichen willst. – icza

+0

Entity ist struct & Eingabe ist eine Zeichenfolge. _type Entity struct { \t Wert Zeichenfolge } Eingang: = r.URL.Query() Liefert ("Input") _ – vindl

+0

Und was wollen Sie "anhängen".? Was willst du erreichen? – icza

Antwort

1

Es kann nur eine Instanz geben, nur eine Entität, die von demselben Datenspeicherschlüssel gebunden/bezeichnet wird.

Und Entitäten (gebunden an einen Schlüssel) können nur überschrieben, nicht aktualisiert/erweitert/angehängt werden.

Wenn Sie also bereits eine Entität gespeichert haben, müssen Sie diese aktualisieren, bevor Sie sie laden, dann die Entität im Speicher ändern und die geänderte Entität aufschreiben (speichern). Diese Speicherung überschreibt die vorhandene Entität im Datenspeicher.

Wenn für eine Eigenschaft mehrere Werte gespeichert werden sollen, muss der Typ dieser Eigenschaft das Speichern mehrerer Werte unterstützen. Slices in Go sind solche Arten.

So in Ihrem Beispiel sollte Ihr Unternehmen wie folgt aussehen:

type Entity struct { 
    Values []string 
} 

Wenn Sie eine vorhandene Entity laden, müssen Sie den neuen Wert zu seiner Values Feld anhängen, so etwas wie dieses (in Pseudo-Code):

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

In Code:

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

Wenn Sie über diese Values-Eigenschaft indexieren müssen, können Probleme auftreten, wenn sie viele Werte enthält. Siehe dieses Duplikat für weitere Details: App Engine Datastore: How to set multiple values on a property using golang?

Wenn Sie auf dieses Problem stoßen, sollten Sie in Erwägung ziehen, Ihre Daten in einem anderen Format zu modellieren und zu speichern, z.Speichern in mehreren Entitäten, wobei eine Entität nur eine einzige input speichert, die mit dem Schlüssel verbunden ist, zu dem sie gehört.

+0

Danke für Vorschlag. Doppelte Daumen hoch. :) – vindl

1

Sie sollten:

  • zuerst eine Einheit erhalten,
  • dann ändern Sie einen Wert
  • und danach aktualisieren Sie die Entität im Datenspeicher.

Bitte mit docs konsultieren: https://cloud.google.com/datastore/docs/concepts/entities#updating_an_entity:

eine bestehende Einheit zu aktualisieren, ändern Sie die Eigenschaften des Unternehmens zuvor abgerufene und speichern Sie es mit der Taste:

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

Ich habe den folgenden Code verwendet. Ich nur neugierig, warum Code unten funktioniert nicht (anhängen) .k: = datastore.NameKey ("Entity", "stringID", nil) \t \t e: = Entity {input} \t wenn _, err = client.Put (ctx, k, &e); err! = nil { \t} – vindl

+0

Ich aktualisierte Abfrage nach Ihrem Vorschlag, aber immer noch kein Erfolg. – vindl

Verwandte Themen