Es gibt Tools und APIs, die Ihnen die Verwaltung der gespeicherten Daten einer Anwendung erleichtern.
Google Cloud Console
Beachten Sie bei der Verwendung der Google Cloud Console, dass NDB mithilfe von Datastore und Memcache implementiert wird. Wenn NDB einen Wert „liest“, wird zuerst der Memcache geprüft. Es liest nur aus Datastore, wenn der Wert in Memcache nicht gefunden wird.
Wenn Sie also mit der Google Cloud Console eine Entität in Datastore bearbeiten, verwendet die Anwendung möglicherweise den „alten“ Wert, wenn sich dieser Wert in Memcache befindet. Sie können dies durch dauerhaftes Löschen von Memcache umgehen. Dies ist jedoch ziemlich disruptiv Wenn Sie häufig Werte manuell anpassen müssen, können Sie in Ihrer Anwendung eine UI dafür einrichten, die Werte über die NDB-Clientbibliothek schreibt. Beim Schreiben über NDB werden Datastore und Memcache synchronisiert.
Metadatenabfragen
NDB unterstützt eine API für Metadatenabfragen. Dadurch kann eine Anwendung allgemeine Informationen über die Verwendung von Datastore abrufen. Diese API befindet sich im Modul google.appengine.ext.ndb.metadata
. Sie hat folgende Funktionen:
get_namespaces(start=None, end=None)
: Gibt eine Liste von Namespace-Namen zurückget_kinds(start=None, end=None)
: Gibt eine Liste von Artnamen zurückget_properties_of_kind(kind, start=None, end=None)
: Gibt eine Liste von Attributnamen von einem angegebenen Artnamen zurückget_representations_of_kind(kind, start=None, end=None)
: Gibt ein dict zurück, das die Attributnamen eines bestimmten Artnamens Listen mit Darstellungsnamen wie „STRING“, „BOOLEAN“ oder „INT64“ zuordnet
Diese Funktionen haben die optionalen Argumente start und end, mit denen die Abfrage auf einen bestimmten Bereich beschränkt werden kann. Hier ist start einschließend und end ausschließend. Beide sind standardmäßig auf None
eingestellt. Wenn Sie beispielsweise alle Namespaces abrufen möchten, deren Namen mit einem Kleinbuchstaben beginnen, können Sie get_namespaces('a', chr(ord('z') + 1))
aufrufen.
Alle mit Ausnahme von get_namespaces()
sind implizit auf den aktuellen Namespace beschränkt. Metadatenabrufe und -abfragen werden wie Datastore-Abrufe und -Abfragen abgerechnet.
Statistikabfragen
Datastore erfasst Statistiken zu den gespeicherten Daten einer Anwendung, wie die Anzahl der Entitäten pro Dateityp oder wie viel Speicherplatz für Attributwerte eines bestimmten Typs verwendet wird. Sie können diese Statistiken in der Google Cloud Console auf der Seite Dashboard einsehen.
Sie können auch programmatisch innerhalb der Anwendung auf diese Werte zugreifen. Führen Sie dazu mit der Datastore API Abfragen nach bestimmten benannten Entitäten aus.
Auf jede Statistik kann als Entität zugegriffen werden, deren Artname mit jeweils zwei Unterstrichen beginnt und endet. Jede Anwendung hat beispielsweise genau eine Entität der Art __Stat_Total__
, die Statistiken für alle Entitäten in Datastore insgesamt darstellt. Alle Statistikentitäten haben folgende Eigenschaften:
count
: die Anzahl der von der Statistik berücksichtigten Elemente (eine lange Ganzzahl)bytes
: die Gesamtgröße der Elemente für diese Statistik (eine lange Ganzzahl)timestamp
: der Zeitpunkt der letzten Aktualisierung der Statistik (ein Datum-/Uhrzeit-Wert)
Einige Statistiktypen besitzen zusätzliche Eigenschaften, die im Folgenden aufgeführt werden.
Eine Anwendung kann Modellklassen verwenden, die vom Paket google.appengine.ext.ndb.stats
bereitgestellt werden, um auf statistische Entitäten zuzugreifen.
from google.appengine.ext.ndb import stats
global_stat = stats.GlobalStat.query().get()
print 'Total bytes stored: %d' % global_stat.bytes
print 'Total entities stored: %d' % global_stat.count
Wenn das Statistiksystem neue Statistikentitäten erstellt, werden die alten nicht sofort gelöscht. Die beste Möglichkeit für eine konsistente Ansicht der Statistiken ist die Abfrage der Statistikentität GlobalStat
mit dem aktuellen timestamp
und der Verwendung dieses Zeitstempelwerts als Filter beim Abruf anderer Statistikentitäten.
Die Statistikentitäten sind in den berechneten Statistikwerten enthalten. Der Speicherbedarf von Statistikentitäten richtet sich nach der Anzahl der von der Anwendung verwendeten eindeutigen Typen und Attributnamen.
Das Statistiksystem erstellt auch für jeden Namespace eigene Statistiken. Wenn eine Anwendung keine Datastore-Namespaces verwendet, werden auch keine Namespace-spezifischen Statistiken erstellt. Namespace-spezifische Statistiken sind in dem Namespace enthalten, für den sie spezifisch sind. Den Artnamen für Namespace-spezifische Statistiken ist __Stat_Ns_
vorangestellt und sie haben dasselbe Suffix wie anwendungsweite Statistikarten.
Anwendungen mit Tausenden von Namespaces, Typen oder Eigenschaftsnamen erfordern eine sehr große Anzahl von Statistikentitäten. Damit der Aufwand für das Speichern und Aktualisieren der Statistiken möglichst gering gehalten wird, löscht Datastore Statistikentitäten progressiv in der folgenden Reihenfolge:
- Statistiken pro Namespace, pro Art und pro Attribut:
__Stat_Ns_PropertyName_Kind__
,__Stat_Ns_PropertyType_PropertyName_Kind__
- Statistiken pro Art und pro Attribut:
__Stat_PropertyName_Kind__
,__Stat_PropertyType_PropertyName_Kind__
- Statistiken pro Namespace und pro Art:
__Stat_Ns_Kind__
,__Stat_Ns_Kind_IsRootEntity__
,__Stat_Ns_Kind_NotRootEntity__
,__Stat_Ns_PropertyType_Kind__
- Statistiken pro Art:
__Stat_Kind__
,__Stat_Kind_IsRootEntity__
,__Stat_Kind_NotRootEntity__
,__Stat_PropertyType_Kind__
- Statistiken pro Namespace:
__Stat_Namespace__
,__Stat_Ns_Kind_CompositeIndex__
,__Stat_Ns_PropertyType__
,__Stat_Ns_Total__
Die zusammenfassenden Statistikentitäten (__Stat_Kind_CompositeIndex__
, __Stat_PropertyType__
, __Stat_Total__
) werden niemals gelöscht.
Die vollständige Liste der verfügbaren Statistiken sieht so aus:
Statistik | Typ der Statistikentität | Beschreibung |
---|---|---|
Alle Entitäten | __Stat_Total__ Python-Klasse: GlobalStat Namespace-spezifischer Eintrag: __Stat_Ns_Total__ Python-Klasse: NamespaceGlobalStat |
Alle Entitäten. Zusätzliche Attribute: • entity_bytes : der Speicherplatz in der Entitätstabelle, gemessen in Byte• builtin_index_bytes : der Speicherplatz in integrierten Indexeinträgen, gemessen in Byte• builtin_index_count : die Anzahl der integrierten Indexeinträge• composite_index_bytes : der Speicherplatz in zusammengesetzten Indexeinträgen, gemessen in Byte• composite_index_count : die Anzahl der zusammengesetzten Indexeinträge |
Alle Entitäten in einem Namespace | __Stat_Namespace__ Python-Klasse: NamespaceStat Beachten Sie, dass __Stat_Namespace__ -Entitäten für jeden ermittelten Namespace erstellt werden und nur im leeren String-Namespace enthalten sind. |
Alle Entitäten in einem Namespace • subject_namespace : der dargestellte Namespace (ein String)• entity_bytes : der Speicherplatz in der Entitätstabelle, gemessen in Byte• builtin_index_bytes : der Speicherplatz in integrierten Indexeinträgen, gemessen in Byte• builtin_index_count : die Anzahl der integrierten Indexeinträge• composite_index_bytes : der Speicherplatz in zusammengesetzten Indexeinträgen, gemessen in Byte• composite_index_count : die Anzahl der zusammengesetzten Indexeinträge |
Alle Einträge in von der Anwendung definierten Indexen | __Stat_Kind_CompositeIndex__ Namespace-spezifischer Eintrag: __Stat_Ns_Kind_CompositeIndex__ Python-Klasse: KindStat |
Einträge in der zusammengesetzten Indextabelle; eine Statistikentität für jede gespeicherte Entitätsart Zusätzliche Attribute: • index_id : die Index-ID• kind_name : der Name des dargestellten Typs (ein String) |
Entitäten einer Art | __Stat_Kind__ Python-Klasse: KindStat Namespace-spezifischer Eintrag: __Stat_Ns_Kind__ Python-Klasse: NamespaceKindStat |
Entitäten einer Art; eine Statistikentität für jede gespeicherte Entitätsart Zusätzliche Attribute: • kind_name : der Name des dargestellten Typs (ein String)• entity_bytes : der Speicherplatz in der Entitätstabelle, gemessen in Byte• builtin_index_bytes : der Speicherplatz in integrierten Indexeinträgen, gemessen in Byte• builtin_index_count : die Anzahl der integrierten Indexeinträge• composite_index_bytes : der Speicherplatz in zusammengesetzten Indexeinträgen, gemessen in Byte• composite_index_count : die Anzahl der zusammengesetzten Indexeinträge |
Stammentitäten einer Art | __Stat_Kind_IsRootEntity__ Python-Klasse: KindRootEntityStat Namespace-spezifischer Eintrag: __Stat_Ns_Kind_IsRootEntity__ Python-Klasse: NamespaceKindRootEntityStat |
Entitäten einer Art, die Entitätsgruppen-Stammentitäten sind (kein übergeordnetes Element haben); eine Statistikentität für jede gespeicherte Entitätsart Zusätzliche Attribute: • kind_name : der Name des dargestellten Typs (ein String)• entity_bytes : der Speicherplatz in der Entitätstabelle, gemessen in Byte |
Nicht-Stammentitäten einer Art | __Stat_Kind_NotRootEntity__ Python-Klasse: KindNotRootEntityStat Namespace-spezifischer Eintrag: __Stat_Ns_Kind_NotRootEntity__ Python-Klasse: NamespaceKindNotRootEntityStat |
Entitäten einer Art, die keine Entitätsgruppen-Stammentitäten sind (ein übergeordnetes Element haben); eine Statistikentität für jede gespeicherte Entitätsart Zusätzliche Attribute: • kind_name : der Name des dargestellten Typs (ein String)• entity_bytes : der Speicherplatz in der Entitätstabelle, gemessen in Byte |
Attribute eines Typs | __Stat_PropertyType__ Python-Klasse: PropertyTypeStat Namespace-spezifischer Eintrag: __Stat_Ns_PropertyType__ Python-Klasse: NamespacePropertyTypeStat |
Attribute eines Werttyps über alle Entitäten hinweg; eine Statistikentität pro Werttyp Zusätzliche Attribute: • property_type : der Name des Werttyps (ein String)• entity_bytes : der Speicherplatz in der Entitätstabelle, gemessen in Byte• builtin_index_bytes : der Speicherplatz in integrierten Indexeinträgen, gemessen in Byte• builtin_index_count : die Anzahl der integrierten Indexeinträge |
Attribute eines Typs pro Entitätsart | __Stat_PropertyType_Kind__ Python-Klasse: KindPropertyTypeStat Namespace-spezifischer Eintrag: __Stat_Ns_PropertyType_Kind__ Python-Klasse: NamespaceKindPropertyTypeStat |
Attribute eines Werttyps über Entitäten einer bestimmten Art hinweg; eine Statistikentität pro Kombination aus Attributtyp und Entitätsart Zusätzliche Attribute: • property_type : der Name des Werttyps (ein String)• kind_name : der Name des dargestellten Typs (ein String)• entity_bytes : der Speicherplatz in der Entitätstabelle, gemessen in Byte• builtin_index_bytes : der Speicherplatz im integrierten Index, gemessen in Byte• builtin_index_count : die Anzahl der integrierten Indexeinträge |
Attribute mit einem Namen | __Stat_PropertyName_Kind__ Python-Klasse: KindPropertyNameStat Namespace-spezifischer Eintrag: __Stat_Ns_PropertyName_Kind__ Python-Klasse: NamespaceKindPropertyNameStat |
Attribute mit einem bestimmten Namen über Entitäten einer bestimmten Art hinweg; eine Statistikentität pro Kombination aus eindeutigem Attributnamen und Entitätsart Zusätzliche Attribute: • property_name : der Name des Attributs (ein String)• kind_name : der Name des dargestellten Typs (ein String)• entity_bytes : der Speicherplatz in der Entitätstabelle, gemessen in Byte• builtin_index_bytes : der Speicherplatz in integrierten Indexeinträgen, gemessen in Byte• builtin_index_count : die Anzahl der integrierten Indexeinträge |
Attribute eines Typs und mit einem Namen | __Stat_PropertyType_PropertyName_Kind__ Python-Klasse: KindPropertyNamePropertyTypeStat Namespace-spezifischer Eintrag: __Stat_Ns_PropertyType_PropertyName_Kind__ Python-Klasse: NamespaceKindPropertyNamePropertyTypeStat |
Attribute mit einem bestimmten Namen und einem bestimmten Werttyp über Entitäten eines bestimmten Typs hinweg; eine Statistikentität pro Kombination von Attributsname, Werttyp und Entitätstyp, die in Datastore vorhanden ist. Zusätzliche Attribute: • property_type : der Name des Werttyps (ein String)• property_name : der Name des Attributs {ein String}• kind_name : der Name der dargestellten Art (ein String)• entity_bytes : der Speicherplatz in der Entitätstabelle, gemessen in Byte• builtin_index_bytes : der Speicherplatz in integrierten Indexeinträgen, gemessen in Byte• builtin_index_count : die Anzahl der integrierten Indexeinträge |
Einige Statistiken beziehen sich auf Werttypen von Datastore-Attributen nach deren Namen, wie Strings. Diese Namen sind:
"Blob"
"BlobKey"
"Boolean"
"Category"
"Date/Time"
"Email"
"Float"
"GeoPt"
"IM"
"Integer"
"Key"
"Link"
"NULL"
"PhoneNumber"
"PostalAddress"
"Rating"
"ShortBlob"
"String"
"Text"
"User"