直接查询迭代VS fetch()或fun()和迭代

时间:2013-04-29 09:50:42

标签: google-app-engine loops iteration

什么会更有效或更方便?

1.- fetch()然后迭代:

query = MyEntity.all()
list = query.run()
for x in list:
    # do something...

2.- run()然后迭代:

query = MyEntity.all()
list = query.run()
for x in list:
    # do something...

3.-直接迭代查询:

query = MyEntity.all()
for x in query:
    # do something...

1 个答案:

答案 0 :(得分:2)

来自_BaseQuery的源代码,它是Model的直接超类:

def run(self, **kwargs):
    """Iterator for this query.

    If you know the number of results you need, use run(limit=...) instead,
    or use a GQL query with a LIMIT clause. It's more efficient. If you want
    all results use run(batch_size=<large number>).

def fetch(self, limit, offset=0, **kwargs):
    """Return a list of items selected using SQL-like limit and offset.

    Always use run(limit=...) instead of fetch() when iterating over a query.

如果你很清楚你将获得多少实体,并且想要预取参考属性或同时进行多个实体的放置,那么获取可能会更有用。

如果您只是在没有获取或运行的情况下进行迭代,那么默认的批量大小可能不是最佳的,因此您将有更多的往返时间增加延迟。

请注意,您还应该考虑使用ndb而不是db,它会为您提供一些其他选项,例如更简单的异步操作,还有query.map()和query.map_async()。