NDB 管理

有些工具與 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"