Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python GAE:确定一种存储了多少的最佳方法?_Python_Google App Engine - Fatal编程技术网

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应用。:-)现有问题的副本: