4

我在 Postgres 中有一个相当大的表(20M+),我是否尝试对其进行原始 Django 查询:

tweets = TweetX.objects.raw("SELECT * from twitter_tweet").using("twittertest")

我很快得到了一个 RawQuerySet,但是当我尝试迭代它的结果时,它就停止了:

for tweet in tweets:
   #do stuff

内存在稳步上升,所以我怀疑整个数据集都在传输。有没有办法从中获取数据库游标,.raw这样我就可以遍历结果集而无需一次全部传输?

4

1 回答 1

5

似乎很难说服 django/postgres 使用数据库游标。相反,它获取所有内容,然后在其上放置一个客户端迭代器(称为游标)。

这里找到了一个显式创建数据库游标的解决方案。唯一的缺点是它不再适合 django 模型。

from django.db import connections

conn = connections['twittertest']
# This is required to populate the connection object properly
if conn.connection is None:
    cursor = conn.cursor()        

cursor = conn.connection.cursor(name='gigantic_cursor')
cursor.execute("SELECT * from twitter_tweet")

for tweet in cursor:
    #profit
于 2013-08-22T15:59:08.600 回答