【问题标题】:How to write a query like SQL's SELECT x FROM如何编写 SQL 的 SELECT x FROM 之类的查询
【发布时间】:2012-01-30 04:20:43
【问题描述】:

我想写一个查询来做这样的 SQL 查询:

SELECT name FROM contacts WHERE blah blah

我知道我可以这样做:

for contact in Contacts.gql(WHERE_CLAUSE, args).fetch(1000):
  print contact.name

但是有没有办法直接从查询中获取name 而不必循环结果?它会在性能方面提供任何优势吗?

【问题讨论】:

  • 您可以仅获取密钥或完整实体。 Only-keys-fetch 具有很大的性能优势。如果您的名字是唯一的,您可以将其用作键。

标签: google-app-engine google-cloud-datastore python-2.7 gql


【解决方案1】:

不。做不到。

GQL 查询返回所请求的零个或多个实体或键 种类。每个 GQL 查询始终以 SELECT * 或 SELECT 开头 。 (GQL 查询不能执行类似 SQL 的“连接”查询。)

http://code.google.com/appengine/docs/python/datastore/gqlreference.html

但是你可以创建一个简单的包装器来为你做这件事。比如:

def get_all_of_field(model, field):
  for x in model.all():
    yield getattr(x, field)

names = get_all_of_field(Contact, 'name')

无论如何,API 都会读取整个“行”,因此无法提高性能。您要么阅读整个“行”,要么只阅读其关键。

【讨论】:

    【解决方案2】:

    您现在可以使用投影查询来执行此操作。对于 db,请参阅此处的文档:

    https://developers.google.com/appengine/docs/python/datastore/projectionqueries

    对于 ndb,请参阅此处的文档:

    https://developers.google.com/appengine/docs/python/ndb/queries#projection

    【讨论】:

      猜你喜欢
      • 2020-05-25
      • 1970-01-01
      • 1970-01-01
      • 2019-06-26
      • 1970-01-01
      • 1970-01-01
      • 2019-11-26
      • 1970-01-01
      • 2011-10-30
      相关资源
      最近更新 更多