在 应用程序引擎 GEA下进行查询和建立索引

178 阅读3分钟

承接上文: 基于 Python 的 GAE 数据建模要点 - 掘金 (juejin.cn)

查询和索引

应用程序引擎提供了一种称为 GQL 的类 SQL 查询语言。

尽管 GQL 不像 SQL 那样具有完整的功能,但它密切地反映了我们在 SQL 世界中所习惯的语法和语义。

实体在 GAE Python 和 JavaSDK 中作为对象显示。因此,GQL 非常类似于用于查询、过滤和获取模型实例及其属性的面向对象查询语言。

Java 持久化查询语言(JPQL)是一种流行的面向对象的 查询语言

要检索 start _ date 为2011年1月1日的五个 Task 实体并打印它们的名称,可以这样查询:


q = db.GqlQuery("SELECT * FROM Task"+"WHERE start_date = :1", datetime.datetime(2011, 1, 1, 12, 0, 0).date())

results =q.fetch(5)

for task in results:

    print ("Task name: %s" %(task.name))

或者,您也可以通过使用 Query 接口查询得到相同的结果,如下所示:

q=Task.a11()

q.filter("start_date =", datetime.datetime(2011, 1, 1, 12, 0, 0).date()) 

results =q.fetch(5) 


for task in results:
    print ( "Task name:%s" %(task.name))

第一个使用 GqlQuery 接口,第二个使用 Query 接口。

在每种情况下,都指定一个筛选器条件来将结果集缩小到只有那些其起始日期属性与指定日期匹配的实体。这类似于通过 SQL where 子句传入条件值。

在前面的示例中,使用2011年1月1日中午12点作为参数。时间部分可以是任何其他相关值,如上午10点或晚上8点,有效参数将保持不变。只使用参数的日期部分。

应用程序引擎允许一组相当丰富的过滤条件,前面示例中的结果是使用提取方法获得的。

提取方法接受一个限制参数来限制结果集。也可以选择将偏移量参数传递给提取方法。因此,在示例中调用 fett (limit = 5,offest = 10) 而不是 fett (5)将返回第11条到第15条记录,而不是前5条记录。

这就引出了顺序的概念,一个显而易见的问题可能是: “结果显示顺序是怎样的?”

由于未指定显式顺序条件,结果的顺序不是确定性的,因此可能从一个查询运行更改为另一个查询运行。为了确保特定的顺序,您可以将其添加到查询中。例如,可以按名称对结果集进行如下排序:

db.GqlQuery("SELECT *FROM Task"+ "WHERE start_date=:1"+ "ORDER BY name",
            datetime.datetime(2011, 1, 1, 12, 0, 0).date())

您可能还记得,Bigtable 以排序和排序的方式存储行

因此,查找特定行不涉及随机读取。相反,可以轻松地使用行键来标识承载行的区域服务器,并且可以顺序读取行数据(或实体)。

当使用实体的属性筛选完整集合时,将查找相应的索引,该索引使行保持所需的排序顺序。

查询通过根据 start_date 属性对 Task 实体进行筛选,然后根据 name 属性对它们进行排序,从而访问 Task 实体。

查询使用一个索引,其中数据按照预先排序的顺序保存,首先按照 start_date,然后按照name。实际上,每个有效查询都是通过基础索引提供的。换句话说,如果没有相应的索引,则不能运行查询。

一些看起来不同的查询可能利用相同的索引。应用程序引擎创建一些隐式索引,特别是那些涉及对属性值、键或祖先的相等运算符进行过滤的索引。对于涉及基于多个属性进行筛选的查询、涉及不等式比较器的查询或具有多个按属性排列的顺序的查询,需要显式地定义索引。开发服务器帮助识别所需的索引,并在运行相应的查询时创建一个索引。索引在名为 index.yaml 的配置文件中显式定义。


本文正在参加「金石计划 . 瓜分6万现金大奖」