Лучший обходной путь может показаться немного нелогичным, но он отлично работает во всех моих приложениях appengine. Вместо того, чтобы полагаться на целочисленные методы KEY и count(), вы добавляете собственное целочисленное поле к типу данных. Это может показаться расточительным, пока у вас действительно не будет более 1000 записей, и вы вдруг обнаружите, что fetch() и limit() НЕ РАБОТАЮТ ЗА ГРАНИЦЕЙ 1000 ЗАПИСЕЙ.
def MyObj(db.Model):
num = db.IntegerProperty()
Когда вы создаете новый объект, вы должны вручную получить самый высокий ключ:
max = MyObj.all().order('-num').get()
if max : max = max.num+1
else : max = 0
newObj = MyObj(num = max)
newObj.put()
Это может показаться пустой тратой запроса, но get() возвращает одну запись из верхней части индекса. Это очень быстро.
Затем, когда вы хотите извлечь больше 1000-го объекта, вы просто делаете:
MyObj.all().filter('num > ' , 2345).fetch(67)
Я уже сделал это, когда прочитал разгромный обзор Aral Balkan: http://aralbalkan.com/1504. Это расстраивает, но когда вы привыкнете к этому и поймете, насколько это быстрее, чем count() в реляционной базе данных, вы не будете возражать...
person
Alyxandor
schedule
19.01.2010