Entitäten erstellen, abrufen, aktualisieren und löschen

Datenobjekte in Datastore werden als Entitäten bezeichnet. Jede Entität wird für Abfragen einer bestimmten Art zugewiesen. Wenn Sie beispielsweise eine Anwendung für das Personalwesen schreiben, können Sie jeden Mitarbeiter mit einer Entität der Art Employee darstellen. Die Entitätsdatenwerte liegen dabei in Form von Attributen vor. Weitere Informationen zu Entitäten finden Sie im Konzeptdokument Entitäten, Attribute und Schlüssel.

Entitäten erstellen und Attribute festlegen

Zum Erstellen einer neuen Entität in Go müssen Sie eine Instanz eines Go-Struct-Objekts anlegen, Werte für die zugehörigen Felder festlegen und die Entität mit datastore.Put in Datastore speichern. Nur mit einem Großbuchstaben beginnende exportierte Felder werden in Datastore gespeichert. Sie können den Schlüsselnamen der Entität durch Übergabe eines nicht leeren stringID-Arguments an datastore.NewKey angeben.

Der folgende Beispielcode erstellt eine Entität der Art Employee, gibt ihre Attributwerte an und speichert die Entität im Datenspeicher:

import (
	"context"
	"time"

	"google.golang.org/appengine/datastore"
)

type Employee struct {
	FirstName          string
	LastName           string
	HireDate           time.Time
	AttendedHRTraining bool
}

func f(ctx context.Context) {
	// ...
	employee := &Employee{
		FirstName: "Antonio",
		LastName:  "Salieri",
		HireDate:  time.Now(),
	}
	employee.AttendedHRTraining = true

	key := datastore.NewIncompleteKey(ctx, "Employee", nil)
	if _, err := datastore.Put(ctx, key, employee); err != nil {
		// Handle err
	}
	// ...
}

Mit dem Typ Employee werden vier Felder für das Datenmodell deklariert: FirstName, LastName, HireDate und AttendedHRTraining.

Wenn Sie einen leeren Schlüsselnamen bereitstellen oder datastore.NewIncompleteKey verwenden, generiert Datastore automatisch eine numerische ID für den Schlüssel der Entität:

employee := &Employee{
	FirstName: "Antonio",
	LastName:  "Salieri",
	HireDate:  time.Now(),
}
employee.AttendedHRTraining = true
key := datastore.NewIncompleteKey(ctx, "Employee", nil)
_, err = datastore.Put(ctx, key, employee)

Entitäten abrufen

Wenn Sie eine Entität mit einem bestimmten Schlüssel abrufen möchten, übergeben Sie den *datastore.Key als Argument an die datastore.Get-Funktion. Sie können den *datastore.Key mit der Funktion datastore.NewKey generieren.

employeeKey := datastore.NewKey(ctx, "Employee", "asalieri", 0, nil)
addressKey := datastore.NewKey(ctx, "Address", "", 1, employeeKey)
var addr Address
err = datastore.Get(ctx, addressKey, &addr)

datastore.Get füllt eine Instanz des entsprechenden Go-STRUCTs mit Werten.

Entitäten aktualisieren

Zum Aktualisieren einer vorhandenen Entität ändern Sie die Attribute der Struktur und rufen anschließend datastore.Put Die Daten überschreiben die vorhandene Entität. Bei jedem Aufruf von datastore.Put wird das ganze Objekt an Datastore gesendet.

Entitäten löschen

Sie können eine Entität unter Angabe ihres Schlüssels mit der Funktion datastore.Delete löschen.

key := datastore.NewKey(ctx, "Employee", "asalieri", 0, nil)
err = datastore.Delete(ctx, key)

Entitäten im Bulk löschen

Wenn Sie eine große Anzahl von Entitäten löschen müssen, empfehlen wir mit Dataflow Entitäten im Bulk zu löschen.

Batch-Vorgänge verwenden

Sie können die folgenden Batchvorgänge verwenden, wenn Sie mehrere Entitäten in einem einzigen Datastore-Aufruf bearbeiten möchten.

Es folgt ein Beispiel für einen Batchaufruf:

// A batch put.
_, err = datastore.PutMulti(ctx, []*datastore.Key{k1, k2, k3}, []interface{}{e1, e2, e3})

// A batch get.
var entities = make([]*T, 3)
err = datastore.GetMulti(ctx, []*datastore.Key{k1, k2, k3}, entities)

// A batch delete.
err = datastore.DeleteMulti(ctx, []*datastore.Key{k1, k2, k3})

Die Durchführung von Aktionen als Batchvorgänge hat keine Auswirkungen auf Ihre Kosten. Jeder Schlüssel in einem Batchvorgang wird unabhängig davon in Rechnung gestellt, ob der Schlüssel vorhanden ist oder nicht. Die Größe der Entitäten in einem Vorgang wirkt sich nicht auf die Kosten aus.