有些工具與 API 可讓您輕鬆管理應用程式的儲存資料。
Google Cloud 控制台
使用 Google Cloud console時,請記得 NDB 是透過 Datastore「以及」Memcache 進行實作。NDB「讀取」值時,會先檢查 Memcache;如果 Memcache 中沒有該值,才會從 Datastore 讀取。
因此,如果您使用 Google Cloud 控制台編輯 Datastore 中的實體,應用程式可能仍會使用「舊」值 (如果該值位於 Memcache 中)。您可以清除 Memcache 來解決這個問題,不過,這項做法相當擾人;如果您經常需要「手動」調整值,不妨在應用程式中設定 UI,透過 NDB 用戶端程式庫寫入值;透過 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):傳回指定種類名稱的屬性名稱清單get_representations_of_kind(kind, start=None, end=None):將指定種類名稱的 dict 對應屬性名稱傳回至「STRING」、「BOOLEAN」或「INT64」之類的表示名稱清單。
這些函式提供選用的「start」和「end」引數,可用於限制查詢特定範圍。其中 start 包含在範圍內,end 則不包含。兩者預設值皆為 None。舉例來說,如要取得開頭為小寫字母的所有命名空間,可以呼叫 get_namespaces('a', chr(ord('z') + 1))。除了 get_namespaces() 以外,所有這些項目都會間接限制在目前的命名空間。中繼資料取得和查詢作業的計費方式與 Datastore 取得和查詢作業的計費方式相同。
統計資料查詢
Datastore 除了儲存應用程式本身的資料外,也會保留相關統計資料,例如特定種類的實體有幾個,或者特定類型的屬性值使用了多少空間。您可以在 Google Cloud 控制台的「資訊主頁」頁面查看這些統計資料。
您也可以使用 Datastore API 查詢名稱特殊的實體,以程式輔助方式在應用程式內部存取這些值。每個統計資料都可當成實體來存取,而實體種類名稱的開頭和結尾是兩條底線。例如,每個應用程式都只有一個屬於 __Stat_Total__ 種類的實體,這個實體代表與 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_,結尾則對應整個應用程式的統計資料種類。
如果應用程式有數千個命名空間、種類或屬性名稱,則需要非常大量的統計資料實體。為了讓儲存及更新統計資料的負擔保持在合理範圍內,Datastore 會主動按照下列順序捨棄統計資料實體:
- 以命名空間、種類和屬性為主的統計資料:
__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 |
複合式索引表中的項目;儲存的每種實體各有一個統計資料實體。其他屬性: • index_id:索引 ID。• kind_name:代表種類的名稱 (字串) |
| 某個種類的實體 | __Stat_Kind__ Python 類別: KindStat 命名空間專屬項目: __Stat_Ns_Kind__ Python 類別: NamespaceKindStat |
某個種類的實體;儲存的每種實體各有一個統計資料實體。其他屬性: • 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 |
某個種類的實體,該實體為實體群組根實體 (沒有祖系父項);儲存的每種實體各有一個統計資料實體。其他屬性: • kind_name:代表種類的名稱 (字串)• entity_bytes:實體資料表的儲存空間,以位元組為單位。 |
| 某個種類的非根實體 | __Stat_Kind_NotRootEntity__ Python 類別: KindNotRootEntityStat 命名空間專屬項目: __Stat_Ns_Kind_NotRootEntity__ Python 類別: NamespaceKindNotRootEntityStat |
某個種類的實體,該實體不是實體群組根實體 (有祖系父項);儲存的每種實體各有一個統計資料實體。其他屬性: • kind_name:代表種類的名稱 (字串)• entity_bytes:實體資料表的儲存空間,以位元組為單位。 |
| 某個類型的屬性 | __Stat_PropertyType__ Python 類別: PropertyTypeStat 命名空間專屬項目: __Stat_Ns_PropertyType__ Python 類別: NamespacePropertyTypeStat |
所有實體的值類型屬性;每個值類型各有一個統計資料實體。其他屬性: • property_type:值類型的名稱 (字串)• entity_bytes:實體資料表的儲存空間,以位元組為單位。• builtin_index_bytes:內建索引項目的儲存空間,以位元組為單位。• builtin_index_count:內建索引項目的數量。 |
| 各種類中某個類型的屬性 | __Stat_PropertyType_Kind__ Python 類別: KindPropertyTypeStat 命名空間專屬項目: __Stat_Ns_PropertyType_Kind__ Python 類別: NamespaceKindPropertyTypeStat |
特定種類實體之值類型的屬性;每個屬性類型和種類的組合各有一個統計資料實體。其他屬性: • property_type:值類型的名稱 (字串)• kind_name:代表種類的名稱 (字串)• entity_bytes:實體資料表的儲存空間,以位元組為單位。• builtin_index_bytes:內建索引項目的儲存空間,以位元組為單位。• builtin_index_count:內建索引項目的數量。 |
| 具有名稱的屬性 | __Stat_PropertyName_Kind__ Python 類別: KindPropertyNameStat 命名空間專屬項目: __Stat_Ns_PropertyName_Kind__ Python 類別: NamespaceKindPropertyNameStat |
在指定種類的實體中具有特定名稱的屬性;每個不重複的屬性名稱和種類組合各有一個統計資料實體。其他屬性: • 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 |
指定種類實體中具有特定名稱且屬於特定值類型的屬性;Datastore 中的每個屬性名稱、值類型和種類組合各有一個統計資料實體。其他屬性: • property_type:值類型的名稱 (字串)• property_name:屬性的名稱 (字串)• kind_name:代表種類的名稱 (字串)• entity_bytes:實體表格中的儲存空間 (以位元組為單位)。• builtin_index_bytes:內建索引項目的儲存空間,以位元組為單位。• builtin_index_count:內建索引項目的數量。 |
某些統計資料會按名稱以字串代表 Datastore 屬性值類型。這些名稱如下所示:
"Blob""BlobKey""Boolean""Category""Date/Time""Email""Float""GeoPt""IM""Integer""Key""Link""NULL""PhoneNumber""PostalAddress""Rating""ShortBlob""String""Text""User"