<p><a href="https://stackoverflow.com/questions/264154/google-appengine-how-to-fetch-more-than-1000">This SO question</a>有一个答案(通过@jgeewax)几乎是正确的(错误的退出条件,正如我在这里所评论的)。这是一个固定的…:</p>
<pre><code>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
</code></pre>
<p>当然,性能问题在于,这将使用一个对数据存储的实际查询来表示每1000个条目——通过保持一个实际计数来反规范化事物,正如@Chris所建议的,这将使用更少的查询。(请务必使用<a href="http://code.google.com/appengine/articles/sharding_counters.html" rel="nofollow noreferrer">sharded counter</a>或其他形式的<a href="http://blog.appenginefan.com/2009/04/efficient-global-counters-revisited.html" rel="nofollow noreferrer">efficient counters</a>作为appengine Fan的解释!)。你知道吗</p>
<p>使用非关系数据库时,反规范化是一个事实,如果操作得当,会对您的性能产生巨大的影响。至于您对DRY表示的担忧,只需使用类方法或其他形式的函数来执行实体的所有put和remove(即,[[除了有问题的类方法之外]],<em>从不直接调用实体上的<code>.put()</code>等方法,而是调用相应的类方法!),这些函数将是保持非规范化计数器最新的明显位置!你知道吗</p>