2010-09-26 32 views
5

Tôi đã đọc ở nhiều vị trí mà GAE đã tăng giới hạn kỷ lục 1000 đối với truy vấn và số lượng, tuy nhiên, tôi chỉ có thể nhận được tổng số hồ sơ 1000. Tôi sẽ không kéo nhiều hơn 1000 truy vấn tại một thời điểm, nhưng các yêu cầu là như vậy mà tôi cần một số các hồ sơ phù hợp.Google App Engine - nhận được số lượng hồ sơ khớp với tiêu chí trên 1000

Tôi hiểu rằng bạn có thể sử dụng con trỏ để "phân trang" thông qua tập dữ liệu, nhưng để chuyển qua chỉ để có được số lượng có vẻ hơi nhiều. Có lẽ khi họ nói rằng họ "dỡ bỏ" giới hạn, đó là giới hạn cứng - bạn vẫn cần phải chu kỳ thông qua kết quả 1000 tại một thời điểm, tôi có đúng không?

Tôi có nên sử dụng phương pháp khác với phương pháp .all()/filter để tạo 1000 lần đếm không?

Cảm ơn bạn trước sự giúp đỡ của bạn!

Trả lời

7

Hành vi của Query.count() không phù hợp với tài liệu khi không có giới hạn được chỉ định rõ ràng - tài liệu cho biết rằng nó sẽ tính "cho đến khi kết thúc đếm hoặc hết giờ". GAE Issue 3671 đã báo cáo lỗi này (khoảng 3 tuần trước).

Cách giải quyết: chỉ định rõ ràng giới hạn và sau đó giá trị đó sẽ được sử dụng (thay vì mặc định là 1.000).

kiểm tra trên http://shell.appspot.com chứng tỏ điều này:

# insert 1500 TestModel entites ... 
# ... 
>>> TestModel.all(keys_only=True).count() 
1000L 
>>> TestModel.all(keys_only=True).count(10000) 
1500L 

Tôi cũng thấy những hành vi tương tự trên phiên bản mới nhất của máy chủ phát triển (1.3.7) sử dụng ứng dụng thử nghiệm đơn giản này:

from google.appengine.ext import webapp, db 
from google.appengine.ext.webapp.util import run_wsgi_app 

class Blah(db.Model): pass 

class MainPage(webapp.RequestHandler): 
    def get(self): 
     for i in xrange(3): 
      db.put([Blah() for i in xrange(500)]) # can only put 500 at a time ... 
     c = Blah.all().count() 
     c10k = Blah.all().count(10000) 
     self.response.out.write('%d %d' % (c,c10k)) 
     # prints "1000 1500" on its first run 

application = webapp.WSGIApplication([('/', MainPage)]) 

def main(): run_wsgi_app(application) 
if __name__ == '__main__': main() 
+0

Tôi sẽ thử giải pháp của bạn và xem tôi nhận được bao xa. Khái niệm rằng bạn phải cung cấp một giới hạn cho số lượng là vô lý, nhưng hy vọng nó sẽ sớm được giải quyết. Cám ơn sự tử tế của anh! – etc

+1

Nó không phải là vô lý - đếm chi phí O (n) thời gian, và có lẽ có một giới hạn trên về bao nhiêu thời gian bạn sẵn sàng để chi đếm? –

+0

thật lạ lùng !? (p.s. Ví dụ thứ hai của bạn không thể làm việc kể từ khi đưa vào hàng loạt được giới hạn 500) – systempuntoout

-1

Theo với điều này App Engine blog post, giới hạn 1000 thực thể mới chỉ bị xóa cho count (và offset) trong phiên bản 1.3.6. Giới hạn đã bị xóa cho fetch kể từ phiên bản 1.3.1. Nâng cấp lên phiên bản mới nhất và giới hạn phải được xóa.

Bạn không cần phải chuyển qua kết quả 1000 tại một thời điểm (mặc dù bạn có thể và thậm chí có thể hiệu quả hơn); chỉ đơn giản là vượt qua trong số lượng tối đa kết quả bạn muốn trở lại:

for m in MyModel.all().fetch(82000): 
     # ... 

Trong các phiên bản trước 1.3.1, số lượng thông qua vào được ít hơn hoặc bằng 1000.

+0

Lý tưởng để nâng cấp lên phiên bản mới nhất sẽ là giải pháp. Thật không may, có một lỗi trong phiên bản mới nhất làm cho tài liệu không phù hợp với hành vi - count() sẽ trả về chỉ 1.000 kết quả trừ khi bạn cung cấp rõ ràng giới hạn lớn hơn 1.000. –

+0

Như ông Underhill đã nêu, vì bất kỳ lý do gì, lỗi hay cách khác, một số đồng bằng trên truy vấn chỉ tạo ra 1000 ngay cả với phiên bản mới nhất. – etc

1

Như đã đề cập trong Issue 3671, bạn có thể đặt giới hạn thành Không (thay vì số cao hơn 1000, vẫn hữu ích khi tính tổng số) nếu bạn muốn đếm tất cả các bản ghi, mặc dù nó không được khuyến nghị để làm điều này và thay vì không chuẩn hóa số lượng trong một giao dịch .

total_records = query.count(limit=None)