保存されたアプリケーション データを簡単に管理できるようにするためのツールと API が用意されています。
Google Cloud コンソール
Google Cloud consoleコンソールを使用するときには、Datastore と memcache によって NDB が実装されることに注意してください。NDB は、値を「読み取る」ときにまず memcache を確認します。memcache に値が見つからない場合に限り、Datastore から読み取ります。
したがって、 Google Cloud コンソールを使用して Datastore のエンティティを編集する際に、その値が memcache にある場合、アプリケーションが引き続き「古い」値を使用する可能性があります。この問題は、memcache をパージすることで回避できますが、これは複雑な作業です。「手作業で」値を頻繁に調整する必要がある場合は、NDB クライアント ライブラリを介して値を書き込む UI をアプリケーション内にセットアップできます。NDB を介して書き込むことで、Datastore と memcache の同期が保たれます。
メタデータ クエリ
NDB はメタデータ クエリ API をサポートしています。これにより、アプリケーションは Datastore の使用に関する一般情報を取得できます。この API は google.appengine.ext.ndb.metadata モジュール内にあり、次の関数を含んでいます。
- get_namespaces(start=None, end=None): 名前空間名のリストを返します。
- get_kinds(start=None, end=None): 種類名のリストを返します。
- get_properties_of_kind(kind, start=None, end=None): 指定された kind のプロパティ名のリストを返します。
- get_representations_of_kind(kind, start=None, end=None): 特定の種類名に関するプロパティ名を表現名(「STRING」、「BOOLEAN」、「INT64」など)のリストにマップする辞書を返します。
これらの関数のオプション引数 start および end を使用すると、クエリを特定の範囲に限定できます。ここで、start はその数値を含み、end はその数値を含みません。どちらもデフォルトは None です。たとえば、小文字で始まるすべての名前空間を取得するには get_namespaces('a', chr(ord('z') + 1)) を呼び出すことができます。get_namespaces() を除く上記のすべての関数は、暗黙的に現在の名前空間に限定されます。メタデータの取得とクエリは、Datastore の取得とクエリと同じ方法で課金されます。
統計クエリ
データストアは、アプリケーション用に保存されているデータに関する統計情報を維持します。たとえば、特定の種類のエンティティ数や特定の型のプロパティ値が使用している容量などです。これらの統計情報は、 Google Cloud コンソールの [ダッシュボード] ページで確認できます。
このような値には、アプリケーション内でプログラミングによってアクセスすることもできます。その場合、Datastore API を使用して特別な名前のエンティティに対してクエリを実行します。各統計情報は、エンティティとしてアクセスできます。このようなエンティティの名前は、先頭と末尾が 2 本のアンダースコアになっています。たとえば各アプリには __Stat_Total__ という種類のエンティティが 1 つだけ存在し、これは Datastore の全エンティティの合計に関する統計情報を表します。各統計情報エンティティには、次のプロパティがあります。
- count: 統計情報で認識されている項目数(長整数)
- bytes: 統計情報の項目の合計サイズ(長整数)
- timestamp: 統計情報が最後に更新された時刻(日時値)
統計情報の一部の種類には、その他に下記で示すプロパティも用意されています。
アプリケーションは、パッケージ google.appengine.ext.ndb.stats で提供されるモデルクラスを使って統計情報エンティティにアクセスできます。
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
統計情報システムが新しい統計情報エンティティを作成しても、古いエンティティがすぐに削除されるわけではありません。整合性のある統計情報を取得する最善の方法として、最新の timestamp を持つ GlobalStat エンティティに対してクエリを実行し、他の統計情報エンティティをフェッチするときは、そのタイムスタンプ値をフィルタとして使用することをおすすめします。
統計情報エンティティは、計算済みの統計情報値に含まれます。統計情報エンティティは、アプリケーションが使用する一意の種類とプロパティ名の数に比例して容量を消費します。
統計情報システムは、各名前空間に固有の統計情報も作成します。アプリケーションが Datastore の名前空間を使用していない場合は、名前空間に固有の統計情報が作成されません。それぞれの名前空間に固有の統計情報は、その名前空間の中に存在します。名前空間に固有の統計情報の種類名には接頭辞として __Stat_Ns_ が付加され、アプリケーション全体の統計情報の種類と同じ対応する接尾辞が付きます。
何千もの名前空間、種類、プロパティ名を使用するアプリケーションでは、非常に多数の統計情報エンティティが必要になります。統計情報の格納と更新にかかるオーバーヘッドを合理的な範囲に収めるため、統計情報エンティティは次の順序で順次破棄されていきます。
- 名前空間、種類、プロパティに基づく統計情報: __Stat_Ns_PropertyName_Kind__、__Stat_Ns_PropertyType_PropertyName_Kind__
- 種類とプロパティに基づく統計情報: __Stat_PropertyName_Kind__、__Stat_PropertyType_PropertyName_Kind__
- 名前空間と種類に基づく統計情報: __Stat_Ns_Kind__、__Stat_Ns_Kind_IsRootEntity__、__Stat_Ns_Kind_NotRootEntity__、__Stat_Ns_PropertyType_Kind__
- 種類に基づく統計情報: __Stat_Kind__、__Stat_Kind_IsRootEntity__、__Stat_Kind_NotRootEntity__、__Stat_PropertyType_Kind__
- 名前空間に基づく統計情報: __Stat_Namespace__、__Stat_Ns_Kind_CompositeIndex__、__Stat_Ns_PropertyType__、__Stat_Ns_Total__
要約統計情報のエンティティ(__Stat_Kind_CompositeIndex__、__Stat_PropertyType__、__Stat_Total__)は破棄されません。
次に、使用可能なすべての統計情報をまとめたリストを示します。
| 統計情報 | 統計情報エンティティの種類 | 説明 | 
|---|---|---|
| すべてのエンティティ | __Stat_Total__Python クラス: GlobalStat名前空間に固有のエントリ: __Stat_Ns_Total__Python クラス: NamespaceGlobalStat | すべてのエンティティ。追加プロパティ: • entity_bytes: エンティティ テーブルのストレージ サイズ(バイト単位)• builtin_index_bytes: 組み込みインデックス エントリのストレージ サイズ(バイト単位)• builtin_index_count: 組み込みインデックスのエントリ数• composite_index_bytes: 複合インデックス エントリのストレージ サイズ(バイト単位)• composite_index_count: 複合インデックスのエントリ数 | 
| 名前空間内のすべてのエンティティ | __Stat_Namespace__Python クラス: NamespaceStat__Stat_Namespace__エンティティは名前空間が発生するたびに作成され、空文字列の名前空間にのみ存在する点に注意してください。 | 名前空間内のすべてのエンティティ • subject_namespace: 名前空間の表現(文字列)• entity_bytes: エンティティ テーブルのストレージ サイズ(バイト単位)• builtin_index_bytes: 組み込みインデックス エントリのストレージ サイズ(バイト単位)• builtin_index_count: 組み込みインデックスのエントリ数• composite_index_bytes: 複合インデックス エントリのストレージ サイズ(バイト単位)• composite_index_count: 複合インデックスのエントリ数 | 
| アプリケーション定義のインデックス内のすべてのエントリ | __Stat_Kind_CompositeIndex__名前空間に固有のエントリ: __Stat_Ns_Kind_CompositeIndex__Python クラス: KindStat | 複合インデックス テーブル内のエントリ。格納されているエンティティの種類ごとに 1 つの統計情報エンティティが作成されます。追加プロパティ: • index_id: インデックス ID• kind_name: 種類名の表現(文字列) | 
| 種類のエンティティ | __Stat_Kind__Python クラス: KindStat名前空間に固有のエントリ: __Stat_Ns_Kind__Python クラス: NamespaceKindStat | 種類のエンティティ。格納されているエンティティの種類ごとに 1 つの統計情報エンティティが作成されます。追加のプロパティ: • kind_name: 種類名の表現(文字列)• entity_bytes: エンティティ テーブルのストレージ サイズ(バイト単位)• builtin_index_bytes: 組み込みインデックス エントリのストレージ サイズ(バイト単位)• builtin_index_count: 組み込みインデックスのエントリ数• composite_index_bytes: 複合インデックス エントリのストレージ サイズ(バイト単位)• composite_index_count: 複合インデックスのエントリ数 | 
| 種類のルート エンティティ | __Stat_Kind_IsRootEntity__Python クラス: KindRootEntityStat名前空間に固有のエントリ: __Stat_Ns_Kind_IsRootEntity__Python クラス: NamespaceKindRootEntityStat | エンティティ グループのルート エンティティ(祖先となる親を持たないエンティティ)となっている種類のエンティティ。格納されているエンティティの種類ごとに 1 つの統計情報エンティティが作成されます。追加のプロパティ: • kind_name: 種類名の表現(文字列)• entity_bytes: エンティティ テーブルのストレージ サイズ(バイト単位) | 
| 種類の非ルート エンティティ | __Stat_Kind_NotRootEntity__Python クラス: KindNotRootEntityStat名前空間に固有のエントリ: __Stat_Ns_Kind_NotRootEntity__Python クラス: NamespaceKindNotRootEntityStat | エンティティ グループの非ルート エンティティ(祖先となる親を持つエンティティ)となっている種類のエンティティ。格納されているエンティティの種類ごとに 1 つの統計情報エンティティが作成されます。追加のプロパティ: • kind_name: 種類名の表現(文字列)• entity_bytes: エンティティ テーブルのストレージ サイズ(バイト単位) | 
| 型のプロパティ | __Stat_PropertyType__Python クラス: PropertyTypeStat名前空間に固有のエントリ: __Stat_Ns_PropertyType__Python クラス: NamespacePropertyTypeStat | すべてのエンティティにわたる値の型のプロパティ。値の型ごとに 1 つの統計情報エンティティが作成されます。追加のプロパティ: • property_type: 値の型の名前(文字列)• entity_bytes: エンティティ テーブルのストレージ サイズ(バイト単位)• builtin_index_bytes: 組み込みインデックス エントリのストレージ サイズ(バイト単位)• builtin_index_count: 組み込みインデックスのエントリ数 | 
| 種類ごとの型のプロパティ | __Stat_PropertyType_Kind__Python クラス: KindPropertyTypeStat名前空間に固有のエントリ: __Stat_Ns_PropertyType_Kind__Python クラス: NamespaceKindPropertyTypeStat | 特定の種類のエンティティにわたる値の型のプロパティ。プロパティの型と種類の組み合わせごとに 1 つの統計情報エンティティが作成されます。追加のプロパティ: • property_type: 値の型の名前(文字列)• kind_name: 種類名の表現(文字列)• entity_bytes: エンティティ テーブルのストレージ サイズ(バイト単位)• builtin_index_bytes: 組み込みインデックスのストレージ サイズ(バイト単位)• builtin_index_count: 組み込みインデックスのエントリ数 | 
| 名前を持つプロパティ | __Stat_PropertyName_Kind__Python クラス: KindPropertyNameStat名前空間に固有のエントリ: __Stat_Ns_PropertyName_Kind__Python クラス: NamespaceKindPropertyNameStat | 特定の種類のエンティティにわたる特定の名前を持つプロパティ。一意のプロパティ名と種類の組み合わせごとに 1 つの統計情報エンティティが作成されます。追加のプロパティ: • property_name: プロパティの名前(文字列)• kind_name: 種類名の表現(文字列)• entity_bytes: エンティティ テーブルのストレージ サイズ(バイト単位)• builtin_index_bytes: 組み込みインデックス エントリのストレージ サイズ(バイト単位)• builtin_index_count: 組み込みインデックスのエントリ数 | 
| 名前を持つ型のプロパティ | __Stat_PropertyType_PropertyName_Kind__Python クラス: KindPropertyNamePropertyTypeStat名前空間に固有のエントリ: __Stat_Ns_PropertyType_PropertyName_Kind__Python クラス: NamespaceKindPropertyNamePropertyTypeStat | 特定の種類のエンティティ全体のプロパティで、特定の名前を持ち、特定の値の型のプロパティとなっているもの。プロパティ名、値の型、データストアに存在する種類の組み合わせごとに 1 つの統計情報エンティティが作成されます。追加のプロパティ: • property_type: 値の型の名前(文字列)• property_name: プロパティの名前(文字列)• kind_name: 種類名の表現(文字列)• entity_bytes: エンティティ テーブルのストレージ サイズ(バイト単位)• builtin_index_bytes: 組み込みインデックス エントリのストレージ サイズ(バイト単位)• builtin_index_count: 組み込みインデックスのエントリ数 | 
一部の統計情報は、データストアのプロパティ値の型を文字列の名前で参照します。名前は次のとおりです。
- "Blob"
- "BlobKey"
- "Boolean"
- "Category"
- "Date/Time"
- "Email"
- "Float"
- "GeoPt"
- "IM"
- "Integer"
- "Key"
- "Link"
- "NULL"
- "PhoneNumber"
- "PostalAddress"
- "Rating"
- "ShortBlob"
- "String"
- "Text"
- "User"