1

我正在将gcloud-python库用于需要服务以下用例的项目:

  • 获取具有其属性子集的一批实体(投影)
  • gcloud.datastore.api.get_multi()为我提供批量获取但不提供投影
  • gcloud.datastore.api.Query()为我提供投影但不提供批量获取(如IN查询)

AFAIK,GQLQuery 提供 IN 查询(​​批量获取)和预测。是否有计划在 gcloud-python 库中支持 GQLQueries?或者,是否有另一种方法可以在单个请求中进行批处理和投影?

4

1 回答 1

3

目前没有办法请求实体属性的子集。当您拥有所需的密钥列表时,您应该使用get_multi().

投影查询背景

在 Datastore 中,投影查询只是索引扫描。

例如,假设您正在编写查询SELECT * FROM MyKind ORDER BY myFirstProp, mySecondProp。此查询将针对索引执行:Index(MyKind, myFirstProp, mySecondProp)。该索引可能类似于:

myFirstProp | mySecondProp | __key__
------------------------------------
a             1              k1
a             2              k2
b             1              k3

对于索引中的每个结果,Datastore 会查找与该索引结果关联的键。如果您在仅进行投影或两者都进行投影的情况下执行投影查询myFirstPropmySecondProp则 Datastore 可以避免执行随机访问查找来查找每个结果的关联实体。这通常是您通过使用预测获得巨大性能提升的地方 - 而不是通过网络传输它的节省。

同样,如果您知道所需的键列表,则可以直接查找该键——无需先查看索引。

IN 运算符

在 Python GQL(不在类似的 Cloud Datastore GQL 中)中,有一个IN运算符,它允许您编写一个类似于以下内容的查询:

SELECT * FROM MyKind WHERE myFirstProp IN ['a', 'b'].

但是,Datastore 实际上并不原生支持此查询。在 python 客户端中,这将被转换为析取范式

SELECT * FROM MyKind WHERE myFirstProp = 'a'
UNION
SELECT * FROM MyKind WHERE myFirstProp = 'b'

这意味着对于 中的每个值IN,您将发出单独的数据存储区查询。

于 2015-06-21T15:41:47.863 回答