注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

郁夫的博客

我爱你们,只是你们不知道!

 
 
 

日志

 
 
 
 

GAE 元数据查询  

2011-01-31 16:56:07|  分类: Google |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

在官方的元数据查询方面缺乏中文翻译,只好自己动手,翻译如下。

元数据查询

元数据查询允许你用容易的构造表达式从你的数据库返回 namespaces,kind,和 properties等元数据。查询返回你的原数据到动态产生的实体中。元数据查询返回当次查询的结果。

通常使用元数据是实现后端的管理功能,元设计环境。例如,你能够使用元数据查询为你的应用程序建造一个定制的管理器。

你也可以在你的应用程序的数据库管理器中查询元数据,但此处显示的数据和元数据查询有一些重要的不同:

及时性-元数据查询返回的数据是当前的查询结果。数据库管理器仅每天更新一次。

广泛性-数据库管理器的数据比可用的元数据查询更广泛。

成本-元数据查询比普通查询使用更多的配额。

这个文档从下面几方面描述的元数据

python中的元数据查询

命名空间查询

类查询

属性查询

属性表现查询

配额使用

python中的元数据查询

在Python中,models的元数据查询是在google.appengine.ext.db.metadata单元中。每个models为元数据查询提供特定的类(kinds)。这些models和kinds和原有程序中models和kinds不冲突。Models和它县官的kinds是:

Model Kind
google.appengine.ext.db.metadata.Namespace
__namespace__
google.appengine.ext.db.metadata.Kind
__kind__
google.appengine.ext.db.metadata.Property
__property__

查询这些类,你能够返回包含所要求元数据的实体。元数据是动态产生的,基于数据库现在的状态。当你创建本地的 Namespace, Kind, and Property 的Python实体,你不能存储他们。如果你尝试这样做,系统抛出一个BadRequestError()错误信息说类违法。

下面用简单的代码,使用GQL 查询打印你应用程序的Namespace

import google.appengine.ext.db 
 
q = db.GqlQuery("SELECT * FROM __namespace__") 
for p in q.fetch(100): 
  print "namespace: '%s'" % p.namespace_name

注:本人用以上语句不成功,不知道是不是人品问题

命名空间(Namespace) 的查询

如果你的应用程序使用了 Namespaces API, 你能使用元查询查找实体中引用的所有命名空间,这允许你更容易的执行跨命名空间的动作,例如管理功能。

模型(model)是在 google.appengine.ext.db.metadata.Namespace 中用特定的类型 __namespace__ 表示。你可以执行 __namespace__  查询,使用GqlQuery接口,或者使用 Query接口用 Namespace.all() 方法。

下面的示例,用GqlQuery打印所有你应用程序的命名空间:

import google.appengine.ext.db 
from google.appengine.ext.db.metadata import Namespace 
 
q = db.GqlQuery("SELECT * FROM __namespace__") 
for p in q.fetch(100): 
  print "namespace: '%s'" % p.namespace_name

注:此方法可执行,但返回命名空间为空,大概我没有引用任何命名空间吧?

命名空间查询返回的实体是命名空间的键值,空的命名空间除外,那将返回一个键用数字 id 1(空的字符串不是一个有限的键名)。这个实体没有属性;因此,keys-only 和non-keys-only 的查询返回同样的信息。

Namespace模型提供一个namespace_name 字符串属性(从键计算)。这个计算属性返回命名空间特定的一个实体键。如果键是1,namespace_name 返回一个空字符串(' ')。

Namespace查询仅支持__key__ 过滤。简化查询, Namespace.key_for_namespace 函数可以从命名空间的名称建造一个键。

下面的例子函数返回一个列表,在一个应用程序的命名空间有两个可选的名称:

import google.appengine.ext.db 
from google.appengine.ext.db.metadata import Namespace 
 
def get_namespaces(start_ns, end_ns, limit): 
  """Return a list of up to limit namespaces between start_ns and end_ns.""" 
  q = Namespace.all() 
  if start_ns: 
    q.filter('__key__ >=', Namespace.key_for_namespace(start_ns)) 
  if end_ns: 
    q.filter('__key__ <=', Namespace.key_for_namespace(end_ns)) 
  results = q.fetch(limit) 
  return map(lambda ns: ns.namespace_name, results)


 


 

  评论这张
 
阅读(337)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017