如何从数据存储中获取超过1000条记录并将所有内容放在一个列表中传递给django?
与1.3.6版本开始(公布八月-17-2010),你CAN
来自更改日志:
所有数据存储区查询的数据存储计数()查询和偏移的结果不再限制为1000.
仅仅为了记录 - 1000个条目的获取限制现在已经消失:
http://googleappengine.blogspot.com/2010/02/app-engine-sdk-131-including-major.html
报价:
不超过1000个结果限制 - 这是正确的:随着游标的增加以及过去几个月中许多小型数据存储区稳定性和性能改进的高潮,我们现在有足够的信心完全取消最大结果限制.无论您是在进行获取,迭代还是使用Cursor,结果数量都没有限制.
通过按键排序并使用最后一个键作为下一个偏移量,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
每当这出现一个限制时,我总是想知道" 你为什么需要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谈话中讨论)是动态计算摘要数据,并保存它.
你不能.
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"硬编码标识符,那么您就不走运了
此1K限制问题已得到解决.
query = MyModel.all() for doc in query: print doc.title
通过将Query对象视为可迭代:迭代器以小批量从数据存储中检索结果,允许应用程序停止迭代结果以避免获取超出需要的数量.当检索到与查询匹配的所有结果时,迭代停止.与fetch()一样,迭代器接口不会缓存结果,因此从Query对象创建新的迭代器将重新执行查询.
最大批量大小为1K.而且您仍然拥有自动数据存储区配额.
但是通过计划1.3.1 SDK,他们引入了可以序列化和保存的游标,以便将来的调用可以从最后停止的查询开始.
1000记录限制是Google AppEngine中的硬限制.
此演示文稿http://sites.google.com/site/io/building-scalable-web-applications-with-google-app-engine介绍了如何使用AppEngine有效地分页数据.
(基本上通过使用数字id作为键并在id上指定WHERE子句.)
获取超过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