Python 逐个获取查询集数据

Python 逐个获取查询集数据,python,django,iteration,django-queryset,Python,Django,Iteration,Django Queryset,我知道常规queryset或迭代器queryset方法一次计算并返回整个数据集 举个例子: my_objects = MyObject.objects.all() for rows in my_objects: # Way 1 for rows in my_objects.iterator(): # Way 2 问题 在这两种方法中,所有行都是一次性获取的。在djago中,是否有任何方法可以从数据库中逐个获取queryset行 为什么会有这种奇怪的要求 目前我的查询获取n

我知道常规queryset或迭代器queryset方法一次计算并返回整个数据集

举个例子:

my_objects = MyObject.objects.all()
for rows in my_objects:            # Way 1
for rows in my_objects.iterator(): # Way 2
问题

在这两种方法中,所有行都是一次性获取的。在djago中,是否有任何方法可以从数据库中逐个获取queryset行

为什么会有这种奇怪的要求

目前我的查询获取n行,但有时我获取


为了解决这个问题,我目前正在使用一个奇怪的
while
循环逻辑。所以我想知道是否有任何本机或内置的方法,或者我的问题首先是否合乎逻辑!!:)

我想你在找我

以上连结引述:

使用Python数组切片语法的子集将查询集限制为一定数量的结果。这相当于SQL的LIMIT和OFFSET子句

换句话说,如果你从一个计数开始,你就可以循环并根据需要取片

cnt = MyObject.objects.count()
start_point = 0
inc = 5
while start_point + inc < cnt:
    filtered = MyObject.objects.all()[start_point:inc]
    start_point += inc
cnt=MyObject.objects.count()
起始点=0
inc=5
当起始点+inc

当然,您可能需要进一步错误处理。

逐行获取可能更糟糕。您可能希望在1000秒等时间内批量检索。我已经(不是我的工作)成功地使用了非常大的查询集。它不会消耗内存,连接消失也不会有问题

以下是该链接的片段:

import gc

def queryset_iterator(queryset, chunksize=1000):
    '''''
    Iterate over a Django Queryset ordered by the primary key

    This method loads a maximum of chunksize (default: 1000) rows in it's
    memory at the same time while django normally would load all rows in it's
    memory. Using the iterator() method only causes it to not preload all the
    classes.

    Note that the implementation of the iterator does not support ordered query sets.
    '''
    pk = 0
    last_pk = queryset.order_by('-pk')[0].pk
    queryset = queryset.order_by('pk')
    while pk < last_pk:
        for row in queryset.filter(pk__gt=pk)[:chunksize]:
            pk = row.pk
            yield row
        gc.collect()
导入gc
def queryset_迭代器(queryset,chunksize=1000):
'''''
迭代按主键排序的Django查询集
此方法在其存储空间中最多加载chunksize(默认值:1000)行
django通常会同时加载内存中的所有行
记忆。使用迭代器()方法只会导致它不预加载所有
上课。
请注意,迭代器的实现不支持有序查询集。
'''
pk=0
last_pk=queryset.order_by('-pk')[0].pk
queryset=queryset.order\u by('pk')
当pk
要解决(2006年,“MySQL服务器消失了”)问题,您的方法没有那么合乎逻辑。若您针对每个条目点击数据库,它将增加查询的数量,这本身将在将来随着应用程序使用量的增长而产生问题。 我认为您应该在迭代结果的所有元素之后关闭mysql连接,然后如果您尝试进行另一个查询,django将创建一个新连接

from django.db import connection:
connection.close()

我假设您已经考虑过解决实际问题,这当然是首选:)这绝对是我在四处挖掘时考虑过的一种方式,看起来很整洁。我想知道django本身是否还有其他没有限制的原生方式?至于实际的问题,那么,它与django版本有关,但由于整个项目都基于它,我对此无能为力……@NoobEditor-我认为这和它得到的一样自然,因为这将修改您执行的查询。您仍将对数据库执行多个查询,但一次只返回N个结果。另一个选项是查看您实际需要返回的内容,并使用
仅返回这些字段。(还请注意,虽然我在我的示例中一次只获取5个,但我想您可以一次处理的远远不止这些)我同意…根据要求,这是我得到的最接近的。此外,它还具有灵活性,取决于查询大小和检索计数@NoobEditor-的确:)这个例子显然没有经过测试,所以如果你决定采用这种方法,你可能需要玩弄循环逻辑(我认为它可能会漏掉最后几行atm)。问题是,
连接在获取查询集时被转储……因此出现了错误。所以即使我关闭并启动新连接,我再次面临同样的问题。我尝试了
连接。连接可用
&
,但没有帮助!:\你的url不是开放的,伙计@e4c5:被重定向到..但它不显示任何页面..再次检查,伙计!!:D