Google app engine, очень удобная и гибкая платформа, для веб разработки, но к сожалению постоянно приходится думать об ограничениях, налагаемых на процессорное время, объем занимаемой памяти, запросы к хранилищу, тем самым, организовывая нас, заставляя писать более оптимизированный код. С другой стороны, а что если действительно нужно выполнять сложную операцию, или «тяжелый запрос»? Тогда хотелось бы «спрятать», сложности и ограничения app engine внутрь изящного синтаксиса python. В данном случае предлагается использовать питоновые итератиры, для того, что бы прозрачно для пользователя, выбирать неограниченное количество записей из app engine. Хотя, как видно из кода, все-таки некоторые ограничения встроены в класс, в ствойстве _debug_limit.
Вот код итератора:
class QueryIter():
_limit_fetch = 1000
_items = None
_cursor = None
_debug_limit = 10000
def __init__(self, query):
self._query = query
self._fetchNext()
def _fetchNext(self):
self._items = iter(self._query.fetch(self._limit_fetch))
self._cursor = self._query.cursor()
def __iter__(self):
return self
def next(self):
self._debug_limit -= 1
if self._debug_limit < = 0:
raise StopIteration
else:
try:
result = self._items.next()
except StopIteration, e:
self._query.with_cursor(self._cursor)
self._fetchNext()
result = self._items.next() # raised exception stop the loop
return result
А вот, пример применения:
query = MyModel.all()
for i in QueryIter(query):
print i