gpt4 book ai didi

python - Django queryset iterator() 无法按预期工作

转载 作者:行者123 更新时间:2023-12-02 03:24:00 25 4
gpt4 key购买 nike

我已经基于 Django 文档测试了 queryset.iterator()

Oracle and PostgreSQL use server-side cursors to stream results from the database without loading the entire result set into memory.

With server-side cursors, the chunk_size parameter specifies the number of results to cache at the database driver level. Fetching bigger chunks diminishes the number of round trips between the database driver and the database, at the expense of memory.

On PostgreSQL, server-side cursors will only be used when the DISABLE_SERVER_SIDE_CURSORS setting is False.

print(settings.DATABASES['default']['ENGINE']) # postgresql

class TestModel(Model):
age = IntegerField(default=1)

# Insert 10 rows
for i in range(10):
TestModel().save()

settings.DEBUG = True
l = logging.getLogger('django.db.backends')
l.setLevel(logging.DEBUG)
l.addHandler(logging.StreamHandler())
# From now, every queries emitted by Django will be printed.

print(settings.DISABLE_SERVER_SIDE_CURSORS) # False

for i in TestModel.objects.all().iterator(chunk_size=2):
print(i.age)

(0.001) DECLARE "_django_curs_4369655232_3" NO SCROLL CURSOR WITH HOLD FOR SELECT "testmodel"."age" FROM "testmodel"; args=()

由于 chunk_size=2(总行数为 10),我预计上述代码每 2 行会访问数据库 5 次。

但是,它似乎只发出一个查询(在打印的查询上方)。

我对queryset.iterator()有误解吗?

最佳答案

您已经正确理解了 queryset.iterator() 的用途。

在本例中 (PostgreSQL) Django 声明了一个应该在迭代器内使用的游标(使用 DECLARE 语句)。

要从游标中获取数据,应首先打开游标(使用 OPEN 语句),然后获取数据(使用 FETCH 语句)。

看来您的日志记录没有捕获迭代器内部发生的任何这些语句,为了确认这一点,您可以在 PostgreSQL 端设置日志记录:)。

关于python - Django queryset iterator() 无法按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53948664/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com