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
Ну почему никто не комментирует? Ведь изящнейшее решение!
А у _debug_limit откуда ноги растут? Это ограничение Gae на максимальное кол-во элементов в выборке? Или это вы сами добавили? Может стоит тогда последовательно вызывать проверку на наличие записей, и порождать новый цикл итераций?
_debug_limit это собственное ограничение, так сказать, здравого смысла, когда вы точно знаете что больше чем 100000 записей нет смыла выбирать
Ошибка в заголовке: “елементов” => “элементов”.
Спасибо. Исправил.
“Вод код”.
Решение удобное, можно в библиотеку его вынести.
_, Useful article – I am often interested in relevant articles. Some other sources you like to share? Will be checking back again to get a response =) …