Python GAE:确定一种存储了多少的最佳方法?
确定我的应用程序数据存储中有多少种特定型号的最佳方法是什么?文档中说,Python GAE:确定一种存储了多少的最佳方法?,python,google-app-engine,Python,Google App Engine,确定我的应用程序数据存储中有多少种特定型号的最佳方法是什么?文档中说,MyKind.all().count()只比检索所有数据稍微好一点,限制为1000。这没有什么帮助,因为我希望存储6000多个MyKind实例 有更好的方法吗?如果我拿到钥匙,数一数怎么办 我正在使用Python。将应用程序的计数器对象存储在数据库中,并在创建和删除对象时进行更新。如果近似计数足够好,可以使用统计API: 如果只使用键,则速度应该相当快,因为这只需要读取索引,实际上并不获取任何实体。使用光标和循环,直到coun
MyKind.all().count()
只比检索所有数据稍微好一点,限制为1000。这没有什么帮助,因为我希望存储6000多个MyKind
实例
有更好的方法吗?如果我拿到钥匙,数一数怎么办
我正在使用Python。将应用程序的计数器对象存储在数据库中,并在创建和删除对象时进行更新。如果近似计数足够好,可以使用统计API:
如果只使用键,则速度应该相当快,因为这只需要读取索引,实际上并不获取任何实体。使用光标和循环,直到count()返回的值小于1000。的答案(由@jgeewax给出)几乎是正确的(错误的退出条件,正如我在这里所评论的)。这里有一个固定的…:
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
当然,性能问题在于,对于每1000个项目,这将使用一个实际的数据存储查询——通过保持实际计数来进行非规范化,正如@Chris所建议的,将使用更少的查询。(请务必使用应用程序引擎或其他形式的应用程序!)
非规范化是非关系数据库的一个现实,如果做得好,会对性能产生巨大的影响。至于您对DRY的担忧,只需使用类方法或其他形式的函数来执行实体的所有put和remove(即[[除了所讨论的类方法之外]],不要直接对实体调用方法,例如
。put()
,而是调用适当的类方法!),这些函数将是保持非规范化计数器最新的明显位置 这是一种痛苦。它不是干的,现在我必须搜索所有代码,以找到创建或删除MyKind
的任何时间。@Rosarch如果MyKind
实例在代码中都是put()
,那么您的设计可能会受益于更一致的DRY应用。:-)现有问题的副本: