一些工具和 API 可帮助您更轻松地管理应用的已存储数据。
Google Cloud 控制台
使用 Google Cloud 控制台时,请记住 NDB 是通过 Datastore 和 Memcache 实现的。当 NDB“读取”某个值时,会先检查 Memcache;只有在 Memcache 中找不到该值时,才会从 Datastore 中读取。
因此,使用 Google Cloud 控制台修改 Datastore 中的某实体时,如果该值位于 Memcache 中,则应用可能仍会使用“旧”值。您可以通过清除 Memcache 中的数据来解决此问题。不过,这种做法会造成一定程度的中断;如果您需要经常“手动”调整值,则可能需要在应用中为此设置一个界面,以便通过 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)
:将给定种类名称的字典映射属性名称返回到表示法名称列表中,如“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"