This SO question có câu trả lời (bởi @jgeewax) là gần như đúng (điều kiện thoát sai, như tôi đã nhận xét). Dưới đây là một cố định ...:
class MyModel(db.Expando):
@classmethod
def count_all(cls):
"""
Count *all* of the rows (without maxing out at 1000)
"""
count = 0
query = cls.all().order('__key__')
while True:
current_count = query.count()
if current_count == 0: return count
count += current_count
if current_count == 1000:
last_key = query.fetch(1, 999)[0].key()
query = query.filter('__key__ > ', last_key)
return count
Vấn đề hiệu suất, tất nhiên, là điều này sẽ sử dụng một truy vấn thực tế để các kho dữ liệu cho mỗi 1000 mục bạn đã - denormalizing thứ bằng cách giữ một số lượng thực tế, như @Chris đề xuất, sẽ sử dụng đến nay ít hơn ít truy vấn hơn. (Hãy chắc chắn sử dụng một số điện thoại sharded counter hoặc các dạng khác của efficient counters làm Người hâm mộ của App Engine giải thích!).
Việc không chuẩn hóa là một thực tế của cuộc sống với DB không quan hệ và được thực hiện đúng cách, có thể tạo ra sự khác biệt lớn cho hiệu suất của bạn to. Đối với những lo lắng mà bạn thể hiện về DRY, chỉ cần sử dụng các phương thức lớp hoặc các dạng hàm khác để thực hiện tất cả các lần đặt và loại bỏ các thực thể của bạn (ví dụ: [[ngoại trừ trong các phương thức lớp được đề cập]], không bao giờ các phương thức gọi như .put()
trực tiếp trên các thực thể, hãy gọi các phương thức lớp thích hợp thay thế!), và các chức năng đó sẽ là nơi hiển nhiên để giữ cho các bộ đếm không chuẩn hóa được cập nhật!
Nguồn
2010-07-12 03:55:06
Sao chép câu hỏi hiện có: http://stackoverflow.com/questions/2988864/how-to-get-the-number-of-rows-in-a-table-in-a-datastore/2989513 –