数据存储:是否有计划添加 GQLQuery 支持?
Datastore: Is there plan to add GQLQuery support?
我正在为需要服务于以下用例的项目使用 gcloud-python 库:
- 获取一批具有其属性子集的实体(投影)
gcloud.datastore.api.get_multi()
为我提供批量获取但不提供投影
- 和
gcloud.datastore.api.Query()
为我提供投影但不提供批量获取(如 IN
查询)
AFAIK,GQLQuery 提供 IN 查询(批量获取)和预测。是否有计划在 gcloud-python 库中支持 GQLQueries?或者,是否有另一种方法可以在单个请求中进行批处理和投影?
目前无法请求实体属性的子集。当您拥有所需的键列表时,您应该使用 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 随后会查找与该索引结果关联的键。如果您执行仅投影 myFirstProp
或 mySecondProp
或两者的投影查询,Datastore 可以避免执行随机访问查找以查找每个结果的关联实体。这通常是您通过使用投影获得巨大性能增益的地方——而不是通过网络传输它的节省。
同样,如果您知道所需的键列表,则可以直接查找键——无需先在索引中查找。
IN 运算符
在 Python GQL (not in the similar Cloud Datastore GQL) 中,有 IN
运算符,它允许您编写类似于以下内容的查询:
SELECT * FROM MyKind WHERE myFirstProp IN ['a', 'b'].
但是,Datastore 实际上本身并不支持此查询。在 python 客户端中,这将被转换为 disjunctive normal form:
SELECT * FROM MyKind WHERE myFirstProp = 'a'
UNION
SELECT * FROM MyKind WHERE myFirstProp = 'b'
这意味着对于 IN
中的每个值,您将发出一个单独的数据存储区查询。
我正在为需要服务于以下用例的项目使用 gcloud-python 库:
- 获取一批具有其属性子集的实体(投影)
gcloud.datastore.api.get_multi()
为我提供批量获取但不提供投影- 和
gcloud.datastore.api.Query()
为我提供投影但不提供批量获取(如IN
查询)
AFAIK,GQLQuery 提供 IN 查询(批量获取)和预测。是否有计划在 gcloud-python 库中支持 GQLQueries?或者,是否有另一种方法可以在单个请求中进行批处理和投影?
目前无法请求实体属性的子集。当您拥有所需的键列表时,您应该使用 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 随后会查找与该索引结果关联的键。如果您执行仅投影 myFirstProp
或 mySecondProp
或两者的投影查询,Datastore 可以避免执行随机访问查找以查找每个结果的关联实体。这通常是您通过使用投影获得巨大性能增益的地方——而不是通过网络传输它的节省。
同样,如果您知道所需的键列表,则可以直接查找键——无需先在索引中查找。
IN 运算符
在 Python GQL (not in the similar Cloud Datastore GQL) 中,有 IN
运算符,它允许您编写类似于以下内容的查询:
SELECT * FROM MyKind WHERE myFirstProp IN ['a', 'b'].
但是,Datastore 实际上本身并不支持此查询。在 python 客户端中,这将被转换为 disjunctive normal form:
SELECT * FROM MyKind WHERE myFirstProp = 'a'
UNION
SELECT * FROM MyKind WHERE myFirstProp = 'b'
这意味着对于 IN
中的每个值,您将发出一个单独的数据存储区查询。