我想编写一个类似SQL查询的查询:
SELECT name FROM contacts WHERE blah blah
我知道我可以这样做:
for contact in Contacts.gql(WHERE_CLAUSE, args).fetch(1000):
print contact.name
但是没有办法直接从查询中获取name
而不必循环结果?它会在性能上提供任何优势吗?
答案 0 :(得分:2)
不。无法完成。
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都会读取整个“行”。要么你阅读整个“行”或只是它的键。
答案 1 :(得分:0)
您现在可以使用投影查询执行此操作。对于db,请参阅此处的文档:
https://developers.google.com/appengine/docs/python/datastore/projectionqueries
对于ndb,请参阅此处的文档:
https://developers.google.com/appengine/docs/python/ndb/queries#projection