当前位置:  开发笔记 > 编程语言 > 正文

如何获取超过1000?

如何解决《如何获取超过1000?》经验,为你挑选了8个好方法。

如何从数据存储中获取超过1000条记录并将所有内容放在一个列表中传递给django?



1> Shay Erlichm..:

与1.3.6版本开始(公布八月-17-2010),你CAN

来自更改日志:

所有数据存储区查询的数据存储计数()查询和偏移的结果不再限制为1000.


例如:numTotalUsers = User.all(keys_only = True).count(999999)#9999999是最大限制.否则我的计数是1000.
@Ivan单个提取只能返回1000,但你可以迭代查询一次获取1000并将偏移设置为下一个1000.我将尽快发布代码.
它应该只有大约3600只能获得1000只.怎么实现这个?谢谢

2> Tomasz Zieli..:

仅仅为了记录 - 1000个条目的获取限制现在已经消失:

http://googleappengine.blogspot.com/2010/02/app-engine-sdk-131-including-major.html

报价:

不超过1000个结果限制 - 这是正确的:随着游标的增加以及过去几个月中许多小型数据存储区稳定性和性能改进的高潮,我们现在有足够的信心完全取消最大结果限制.无论您是在进行获取,迭代还是使用Cursor,结果数量都没有限制.



3> JJ Geewax..:

通过按键排序并使用最后一个键作为下一个偏移量,App Engine为您提供了一种很好的方式,通过1000"分页"结果.他们甚至提供了一些示例代码:

http://code.google.com/appengine/docs/python/datastore/queriesandindexes.html#Queries_on_Keys

虽然他们的示例将查询分散到多个请求中,但您可以将页面大小从20更改为1000并在循环中查询,并组合查询集.此外,您可以使用itertools链接查询,而无需在需要之前对其进行评估.

例如,要计算超过1000的行数:

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 count % 1000 == 0:
            current_count = query.count()
            if current_count == 0:
                break

            count += current_count

            if current_count == 1000:
                last_key = query.fetch(1, 999)[0].key()
                query = query.filter('__key__ > ', last_key)

        return count


这不行.永远不会输入while循环b/c count初始化为零.
如果实际计数恰好是1000的精确倍数 - 错误的退出条件,这将永远循环! - 否则很好......

4> Tony Arkles..:

每当这出现一个限制时,我总是想知道" 你为什么需要1000多个结果?" 您是否知道Google自己没有提供超过1,000个结果?试试这个搜索:http://www.google.ca/search?hl = en&client = firefox-a&rls = org.mozilla:en- US:official& hs = qhu&q = 1000+results&start = 1000&sa = N 我直到最近,因为我从来没有花时间点击查询的第100页搜索结果.

如果您实际上将超过1,000个结果返回给用户,那么我认为手头上存在的问题比数据存储不允许您这样做的事实更大.

如果您对数据执行大型操作并显示摘要(例如,所有这些数据的平均值),那么需要许多结果的一个可能(合法)理由是.这个问题的解决方案(在谷歌I/O谈话中讨论)是动态计算摘要数据,并保存它.



5> Kent Fredric..:

你不能.

FAQ的一部分说明你无法访问查询的第1000行,增加"OFFSET"只会导致更短的结果集,

即:OFFSET 999 - > 1结果回来了.

来自维基百科:

App Engine将实体返回的最大行数限制为每个数据存储区调用1000行.大多数Web数据库应用程序使用分页和缓存,因此不需要同时使用这么多数据,因此在大多数情况下这都不是问题.[引证需要]如果应用程序每个操作需要超过1,000条记录,它可以使用它拥有客户端软件或Ajax页面以在无限数量的行上执行操作.

来自http://code.google.com/appengine/docs/whatisgoogleappengine.html

服务限制的另一个示例是查询返回的结果数.查询最多可返回1,000个结果.返回更多结果的查询仅返回最大值.在这种情况下,执行此类查询的请求不可能在超时之前返回请求,但是限制是为了节省数据存储上的资源.

来自http://code.google.com/appengine/docs/datastore/gqlreference.html

注意:LIMIT子句的最大值为1000.如果指定了大于最大值的限制,则使用最大值.同样的最大值适用于GqlQuery类的fetch()方法.

注意:与fetch()方法的offset参数一样,GQL查询字符串中的OFFSET不会减少从数据存储区中提取的实体数.它只影响fetch()方法返回的结果.具有偏移的查询具有与偏移大小线性对应的性能特征.

来自http://code.google.com/appengine/docs/datastore/queryclass.html

limit和offset参数控制从数据存储中提取的结果数量,以及fetch()方法返回的结果数量:

数据存储区将偏移量+限制结果提取给应用程序.数据存储区本身不会跳过第一个偏移结果.

fetch()方法跳过第一个偏移结果,然后返回其余的结果(限制结果).

查询具有与偏移量加上限制线性对应的性能特征.

这意味着什么

如果您有单数查询,则无法请求0-1000范围之外的任何内容.

增加偏移量只会提高0,所以

LIMIT 1000  OFFSET 0    

将返回1000行,

LIMIT 1000 OFFSET 1000 

将返回0行,因此,使用单个查询语法,无法手动或使用API​​获取2000结果.

唯一合理的例外

是在表上创建一个数字索引,即:

 SELECT * FROM Foo  WHERE ID > 0 AND ID < 1000 

 SELECT * FROM Foo WHERE ID >= 1000 AND ID < 2000

如果您的数据或查询不能具有此"ID"硬编码标识符,那么您就不走运了


请注意,此答案现在有些过时了:__ key__伪属性现在可用于排序和过滤,这允许您分段迭代任意大的结果集.

6> 小智..:

此1K限制问题已得到解决.

query = MyModel.all()
for doc in query:
    print doc.title

通过将Query对象视为可迭代:迭代器以小批量从数据存储中检索结果,允许应用程序停止迭代结果以避免获取超出需要的数量.当检索到与查询匹配的所有结果时,迭代停止.与fetch()一样,迭代器接口不会缓存结果,因此从Query对象创建新的迭代器将重新执行查询.

最大批量大小为1K.而且您仍然拥有自动数据存储区配额.

但是通过计划1.3.1 SDK,他们引入了可以序列化和保存的游标,以便将来的调用可以从最后停止的查询开始.



7> jakber..:

1000记录限制是Google AppEngine中的硬限制.

此演示文稿http://sites.google.com/site/io/building-scalable-web-applications-with-google-app-engine介绍了如何使用AppEngine有效地分页数据.

(基本上通过使用数字id作为键并在id上指定WHERE子句.)



8> Tzach..:

获取超过1000条记录时,远程api仍然存在问题.我们编写了这个小函数来迭代遍历表中的一个表:

def _iterate_table(table, chunk_size = 200):
    offset = 0
    while True:
        results = table.all().order('__key__').fetch(chunk_size+1, offset = offset)
        if not results:
            break
        for result in results[:chunk_size]:
            yield result
        if len(results) < chunk_size+1:
            break
        offset += chunk_size

推荐阅读
mobiledu2402851173
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有