AppEngine, преодоление лимита в 1000 элементов на запрос

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

Comments

comments


Bookmark and Share