Esistono strumenti e API per semplificare la gestione dei dati memorizzati di un'applicazione.
Console Google Cloud
Quando utilizzi la console Google Cloud, ricorda che NDB viene implementato tramite Datastore e memcache. Quando NDB "legge" un valore, controlla prima memcache; legge da Datastore solo se non trova il valore in memcache.
Pertanto, se utilizzi la console Google Cloud per modificare un'entità in Datastore, l'applicazione potrebbe comunque utilizzare il valore "vecchio" se questo valore è in memcache. Puoi aggirare il problema svuotando memcache. Tuttavia, questo metodo è piuttosto dirompente. Se devi modificare spesso i valori "a mano", ti consigliamo di configurare un'interfaccia utente per l'applicazione che scriva i valori tramite la libreria client NDB. La scrittura tramite NDB mantiene sincronizzati Datastore e memcache.
Query dei metadati
NDB supporta un'API di query sui metadati. In questo modo un'applicazione può ottenere alcune informazioni generali sull'utilizzo di Datastore. Questa API si trova nel modulo google.appengine.ext.ndb.metadata
. Ha le seguenti funzioni:
get_namespaces(start=None, end=None)
: restituisce un elenco di nomi di spazi dei nomiget_kinds(start=None, end=None)
: restituisce un elenco di nomi di tipoget_properties_of_kind(kind, start=None, end=None)
: restituisce un elenco di nomi di proprietà per il nome del tipo specificatoget_representations_of_kind(kind, start=None, end=None)
: restituisce un dizionario che mappa i nomi delle proprietà per il nome del tipo specificato a elenchi di nomi di rappresentazioni come "STRINGA", "BOOLEANO" o "INT64".
Queste funzioni hanno argomenti facoltativi start e end che possono essere utilizzati per limitare la query a un determinato intervallo. In questo caso, start è inclusivo e end è
esclusivo. Il valore predefinito per entrambi è None
. Ad esempio, per ottenere tutti gli spazi dei nomi che iniziano con una lettera minuscola, puoi chiamare get_namespaces('a', chr(ord('z') + 1))
.
Tutti questi, tranne get_namespaces()
, sono limitati implicitamente allo spazio dei nomi corrente. Le query e i get dei metadati vengono fatturati nello stesso modo delle query e dei get di Datastore.
Query sulle statistiche
Datastore gestisce le statistiche relative ai dati archiviati per un'applicazione, ad esempio il numero di entità di un determinato tipo o la quantità di spazio utilizzata dai valori delle proprietà di un determinato tipo. Puoi visualizzare queste statistiche nella pagina Dashboard della console Google Cloud.
Puoi anche accedere a questi valori in modo programmatico all'interno dell'applicazione eseguendo query sulle entità con nomi speciali utilizzando l'API Datastore.
Ogni statistica è accessibile come entità il cui nome del tipo inizia e termina con due trattini bassi. Ad esempio, ogni app ha esattamente un'entità di tipo
__Stat_Total__
che rappresenta le statistiche su tutte le entità in
Datastore in totale. Ogni entità statistica ha le seguenti proprietà:
count
, il numero di elementi considerati dalla statistica (un numero intero lungo)bytes
, la dimensione totale degli elementi per questa statistica (un numero intero lungo)timestamp
, l'ora dell'aggiornamento più recente della statistica (un valore data/ora)
Alcuni tipi di statistiche hanno anche proprietà aggiuntive, elencate di seguito.
Un'applicazione può utilizzare le classi di modelli fornite dal pacchetto
google.appengine.ext.ndb.stats
per accedere alle entità statistiche.
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
Quando il sistema delle statistiche crea nuove entità statistiche, non elimina subito quelle vecchie. Il modo migliore per ottenere una visione coerente delle statistiche è eseguire una query per l'entità GlobalStat
con il valore timestamp
più recente, quindi utilizzare questo valore del timestamp come filtro per recuperare altre entità statistiche.
Le entità statistiche sono incluse nei valori statistici calcolati. Le entità statistiche occupano spazio in base al numero di tipi e nomi di proprietà unici utilizzati dall'applicazione.
Il sistema di statistiche creerà anche statistiche specifiche per ogni
spazio dei nomi.
Tieni presente che se un'applicazione non utilizza gli spazi dei nomi di Datastore,
le statistiche specifiche dello spazio dei nomi non verranno create. Le statistiche specifiche dello spazio dei nomi
si trovano nello spazio dei nomi a cui si riferiscono. I nomi dei tipi per le statistiche specifiche dell'ambito hanno il prefisso __Stat_Ns_
e hanno lo stesso suffisso corrispondente dei tipi di statistiche a livello di applicazione.
Le applicazioni con migliaia di spazi dei nomi, tipi o nomi di proprietà richiedono un gran numero di entità statistiche. Per mantenere ragionevole il sovraccarico di archiviazione e aggiornamento delle statistiche, Datastore elimina progressivamente le entità statistiche, nell'ordine seguente:
- Statistiche per spazio dei nomi, tipo e proprietà:
__Stat_Ns_PropertyName_Kind__
,__Stat_Ns_PropertyType_PropertyName_Kind__
- Statistiche per tipo e per proprietà:
__Stat_PropertyName_Kind__
,__Stat_PropertyType_PropertyName_Kind__
- Statistiche per namespace e tipo:
__Stat_Ns_Kind__
,__Stat_Ns_Kind_IsRootEntity__
,__Stat_Ns_Kind_NotRootEntity__
,__Stat_Ns_PropertyType_Kind__
- Statistiche per tipo:
__Stat_Kind__
,__Stat_Kind_IsRootEntity__
,__Stat_Kind_NotRootEntity__
,__Stat_PropertyType_Kind__
- Statistiche per spazio dei nomi:
__Stat_Namespace__
,__Stat_Ns_Kind_CompositeIndex__
,__Stat_Ns_PropertyType__
,__Stat_Ns_Total__
Le entità delle statistiche di riepilogo (__Stat_Kind_CompositeIndex__
,
__Stat_PropertyType__
, __Stat_Total__
) non vengono mai eliminate.
Di seguito è riportato l'elenco completo delle statistiche disponibili:
Statistica | Tipo di entità di statistica | Descrizione |
---|---|---|
tutte le entità | __Stat_Total__ Classe Python: GlobalStat Voce specifica per lo spazio dei nomi: __Stat_Ns_Total__ Classe Python: NamespaceGlobalStat |
Tutte le entità. Proprietà aggiuntive: • entity_bytes : lo spazio di archiviazione nella tabella delle entità misurato in byte.• builtin_index_bytes : lo spazio di archiviazione nelle voci dell'indice integrate misurato in byte.• builtin_index_count : il conteggio delle voci dell'indice integrate.• composite_index_bytes : lo spazio di archiviazione nelle voci dell'indice composito misurato in byte.• composite_index_count : il conteggio delle voci dell'indice composito. |
tutte le entità in uno spazio dei nomi | __Stat_Namespace__ Classe Python: NamespaceStat Tieni presente che le entità __Stat_Namespace__ vengono create per ogni spazio dei nomi incontrato e si trovano solo nello spazio dei nomi della stringa vuota. |
Tutte le entità in uno spazio dei nomi. • subject_namespace , lo spazio dei nomi rappresentato (una stringa)• entity_bytes : lo spazio di archiviazione nella tabella delle entità misurato in byte.• builtin_index_bytes : lo spazio di archiviazione nelle voci dell'indice integrate misurato in byte.• builtin_index_count : il conteggio delle voci dell'indice integrate.• composite_index_bytes : lo spazio di archiviazione nelle voci dell'indice composito misurato in byte.• composite_index_count : il conteggio delle voci dell'indice composito. |
Tutte le voci degli indici definiti dall'applicazione | __Stat_Kind_CompositeIndex__ Voce specifica per lo spazio dei nomi: __Stat_Ns_Kind_CompositeIndex__ Classe Python: KindStat |
Voci nella tabella dell'indice composito; un'entità stat per ogni tipo di entità archiviata. Proprietà aggiuntive: • index_id , l'ID indice.• kind_name , il nome del tipo rappresentato (una stringa) |
entità di un tipo | __Stat_Kind__ Classe Python: KindStat Voce specifica per lo spazio dei nomi: __Stat_Ns_Kind__ Classe Python: NamespaceKindStat |
Entità di un tipo; un'entità di stato per ogni tipo di entità archiviata. Proprietà aggiuntive: • kind_name , il nome del tipo rappresentato (una stringa)• entity_bytes : lo spazio di archiviazione nella tabella delle entità misurato in byte.• builtin_index_bytes : lo spazio di archiviazione nelle voci dell'indice integrate misurato in byte.• builtin_index_count : il conteggio delle voci dell'indice integrate.• composite_index_bytes : lo spazio di archiviazione nelle voci dell'indice composito misurato in byte.• composite_index_count : il conteggio delle voci dell'indice composito. |
entità principali di un tipo | __Stat_Kind_IsRootEntity__ Classe Python: KindRootEntityStat Voce specifica per lo spazio dei nomi: __Stat_Ns_Kind_IsRootEntity__ Classe Python: NamespaceKindRootEntityStat |
Entità di un tipo che sono entità di primo livello del gruppo di entità (non hanno un'entità principale precedente); un'entità di stato per ogni tipo di entità archiviata. Proprietà aggiuntive: • kind_name , il nome del tipo rappresentato (una stringa)• entity_bytes : lo spazio di archiviazione nella tabella delle entità misurato in byte. |
entità non principali di un tipo | __Stat_Kind_NotRootEntity__ Classe Python: KindNotRootEntityStat Voce specifica per lo spazio dei nomi: __Stat_Ns_Kind_NotRootEntity__ Classe Python: NamespaceKindNotRootEntityStat |
Entità di un tipo che non sono entità principali del gruppo di entità (hanno un'entità principale del gruppo di entità); un'entità di stato per ogni tipo di entità archiviata. Proprietà aggiuntive: • kind_name , il nome del tipo rappresentato (una stringa)• entity_bytes : lo spazio di archiviazione nella tabella delle entità misurato in byte. |
proprietà di un tipo | __Stat_PropertyType__ Classe Python: PropertyTypeStat Voce specifica per lo spazio dei nomi: __Stat_Ns_PropertyType__ Classe Python: NamespacePropertyTypeStat |
Proprietà di un tipo di valore in tutte le entità; un'entità statistica per tipo di valore. Proprietà aggiuntive: • property_type , il nome del tipo di valore (una stringa)• entity_bytes : lo spazio di archiviazione nella tabella delle entità misurato in byte.• builtin_index_bytes : lo spazio di archiviazione nelle voci dell'indice integrate misurato in byte.• builtin_index_count : il conteggio delle voci dell'indice incorporate. |
proprietà di un tipo per tipo | __Stat_PropertyType_Kind__ Classe Python: KindPropertyTypeStat Voce specifica per lo spazio dei nomi: __Stat_Ns_PropertyType_Kind__ Classe Python: NamespaceKindPropertyTypeStat |
Proprietà di un tipo di valore nelle entità di un determinato tipo; un'entità statistica per ogni combinazione di tipo e tipo di proprietà. Proprietà aggiuntive: • property_type , il nome del tipo di valore (una stringa)• kind_name , il nome del tipo rappresentato (una stringa)• entity_bytes : lo spazio di archiviazione nella tabella delle entità misurato in byte.• builtin_index_bytes : lo spazio di archiviazione nell'indice integrato misurato in byte.• builtin_index_count : il conteggio delle voci dell'indice incorporate. |
proprietà con un nome | __Stat_PropertyName_Kind__ Classe Python: KindPropertyNameStat Voce specifica per lo spazio dei nomi: __Stat_Ns_PropertyName_Kind__ Classe Python: NamespaceKindPropertyNameStat |
Proprietà con un determinato nome nelle entità di un determinato tipo; un'entità statistica per ogni combinazione di tipo e nome di proprietà univoci. Proprietà aggiuntive: • property_name , il nome della proprietà (una stringa)• kind_name , il nome del tipo rappresentato (una stringa)• entity_bytes : lo spazio di archiviazione nella tabella delle entità misurato in byte.• builtin_index_bytes : lo spazio di archiviazione nelle voci dell'indice integrate misurato in byte.• builtin_index_count : il conteggio delle voci dell'indice incorporate. |
proprietà di un tipo e con un nome | __Stat_PropertyType_PropertyName_Kind__ Classe Python: KindPropertyNamePropertyTypeStat Voce specifica per lo spazio dei nomi: __Stat_Ns_PropertyType_PropertyName_Kind__ Classe Python: NamespaceKindPropertyNamePropertyTypeStat |
Proprietà con un determinato nome e di un determinato tipo di valore nelle entità di un determinato tipo; un'entità di statistica per ogni combinazione di nome della proprietà, tipo di valore e tipo esistenti in Datastore. Proprietà aggiuntive: • property_type , il nome del tipo di valore (una stringa)• property_name , il nome della proprietà (una stringa)• kind_name , il nome del tipo rappresentato (una stringa)• entity_bytes : lo spazio di archiviazione nella tabella delle entità misurato in byte.• builtin_index_bytes : lo spazio di archiviazione nelle voci dell'indice integrate misurato in byte.• builtin_index_count : il conteggio delle voci dell'indice incorporate. |
Alcune statistiche fanno riferimento ai tipi di valori delle proprietà Datastore per nome, come stringhe. Questi nomi sono i seguenti:
"Blob"
"BlobKey"
"Boolean"
"Category"
"Date/Time"
"Email"
"Float"
"GeoPt"
"IM"
"Integer"
"Key"
"Link"
"NULL"
"PhoneNumber"
"PostalAddress"
"Rating"
"ShortBlob"
"String"
"Text"
"User"