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 erhalten Sie in der Dokumentation zu Ancestor-Pfaden und Transaktionen.

Entitäten erstellen und Properties festlegen

Sie können eine Entität durch Aufruf der Konstruktormethode für ihre Modellklasse erstellen und festlegen. Weitere Informationen zum Erstellen einer Modellklasse für Entitäten finden Sie unter Modellklassen für Entitäten erstellen und verwenden.

Im folgenden Beispiel sehen Sie, wie ein Modellklassenkonstruktor mit Schlüsselwortargumenten aufgerufen wird:

sandy = Account(
    username='Sandy', userid=123, email='sandy@example.com')

Mit diesem Code wird im Hauptspeicher Ihres Programms ein Objekt erstellt. Beachten Sie jedoch, dass die Entität gelöscht wird, sobald der Prozess beendet wird. Daher müssen Sie die Entität auch in Datastore erhalten, rufen Sie dazu put() so auf:

sandy_key = sandy.put()

Beachten Sie, dass hierdurch ein Schlüssel zurückgegeben wird, den Sie später zum Abrufen der Entität aus Datastore verwenden können.

Legen Sie Attribute mithilfe einer der folgenden Optionen fest:

  • Geben Sie die Attribute der Entität für den Konstruktor mit Keyword-Argumenten an:
    sandy = Account(
        username='Sandy', userid=123, email='sandy@example.com')
  • Legen Sie Attribute nach Erstellung der Entität manuell fest:
    sandy = Account()
    sandy.username = 'Sandy'
    sandy.userid = 123
    sandy.email = 'sandy@example.com'
  • Verwenden Sie die praktische Methode populate(), um mehrere Attribute in einem Vorgang festzulegen:
    sandy = Account()
    sandy.populate(
        username='Sandy',
        userid=123,
        email='sandy@gmail.com')

Unabhängig davon, wie Sie die Attribute der Entität festlegen, erzwingen die Attributtypen (in diesem Fall StringProperty und IntegerProperty) die Typprüfung.

Beispiel:

bad = Account(
    username='Sandy', userid='not integer')  # raises an exception
...
sandy.username = 42  # raises an exception

Entitäten mit Schlüsseln abrufen

Wenn Sie den Schlüssel einer Entität kennen, können Sie die Entität aus Datastore abrufen:

sandy = sandy_key.get()

Die Schlüsselmethoden kind() und id() stellen die Art und die ID der Entität aus dem Schlüssel wieder her:

kind_string = sandy_key.kind()  # returns 'Account'
ident = sandy_key.id()  # returns '2'

Sie können mit dem Schlüssel einer Entität auch einen codierten String abrufen, der zum Einbetten in eine URL geeignet ist:

url_string = sandy_key.urlsafe()

Dies führt zu einem Ergebnis wie agVoZWxsb3IPCxIHQWNjb3VudBiZiwIM, das später verwendet werden kann, um den Schlüssel zu rekonstruieren und die ursprüngliche Entität abzurufen:

sandy_key = ndb.Key(urlsafe=url_string)
sandy = sandy_key.get()

Der URL-sichere Schlüssel wirkt verschlüsselt, was jedoch nicht der Fall ist. Er lässt sich einfach entschlüsseln, um die Art und Kennung der ursprünglichen Entität wiederherzustellen.

key = Key(urlsafe=url_string)
kind_string = key.kind()
ident = key.id()

Wenn Sie solche URL-sicheren Schlüssel verwenden, sollten Sie keine vertraulichen Daten wie E-Mail-Adressen als Entitätenkennungen nutzen. Es wäre beispielsweise möglich, einen Hash der vertraulichen Daten als Kennung zu verwenden. Dadurch können Dritte, die die verschlüsselten Schlüssel sehen können, keine E-Mail-Adressen abrufen. Sie werden jedoch nicht daran gehindert, einen eigenen Hash einer bekannten E-Mail-Adresse zu erstellen und damit zu prüfen, ob diese Adresse in Datastore vorhanden ist.

Entitäten aktualisieren

Wenn Sie eine vorhandene Entität aktualisieren möchten, rufen Sie sie aus Cloud Datastore ab, ändern Sie ihre Attribute und speichern Sie sie noch einmal:

sandy = key.get()
sandy.email = 'sandy@example.co.uk'
sandy.put()

Sie können den von put() zurückgegebenen Wert in diesem Fall ignorieren, da sich ein Entitätsschlüssel nicht ändert, wenn er aktualisiert wird.

Entitäten löschen

Wenn eine Entität nicht mehr benötigt wird, können Sie sie mit der Methode delete() des Schlüssels aus Cloud Datastore entfernen:

sandy.key.delete()

Dies ist ein Vorgang mit dem Schlüssel, nicht mit der Entität selbst. Er gibt immer None zurück.

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.

Batchvorgänge verwenden

Sie können eine Sammlung von Entitäten oder Schlüsseln in einem einzelnen Aufruf verarbeiten, z. B. in einer Schleife. Die Verarbeitung in einzelnen Aufrufen ist nicht erforderlich. Dies führt zu einem einzelnen Remoteprozeduraufruf (RPC) und nicht zu einem separaten RPC-Aufruf für jede Entität.

Sie sehen an dem folgenden Code, wie es geht:

list_of_keys = ndb.put_multi(list_of_entities)
list_of_entities = ndb.get_multi(list_of_keys)
ndb.delete_multi(list_of_keys)

Im obigen Code übergeben Sie eine Liste von Schlüsselobjekten an ndb.get_multi, um mehrere Entitäten im Batch abzurufen. ndb.get_multi gibt eine Liste von Entitätsobjekten mit None-Werten für Schlüssel zurück, für die es in Datastore keine entsprechende Entität gibt. Wenn Entitäten so abgerufen werden, führt dies zu weniger Aufrufen von Datastore für den gesamten Batch. Die Anzahl der Anrufe pro Batch hängt von Ihren Einstellungen für die Batchgröße ab.