我必须处理一个大的结果集(可能是数十万行,有时甚至更多) 不幸的是,它们需要一次性检索(启动时)。
我试图通过使用尽可能少的内存来做到这一点
通过查看,我发现使用SSCursor
可能是我正在寻找的,但我仍然不知道如何正确使用它们。
从基础光标或SScursor做一个fetchall()
是否相同(根据内存使用情况)?
我可以从sscursor我的行逐个“流动”(或者几个),如果是,则
最好的方法是什么?
答案 0 :(得分:29)
我同意Otto Allmendinger的回答,但是为了明确Denis Otkidach的评论,这里是你如何在不使用Otto的fetch()函数的情况下迭代结果:
import MySQLdb.cursors
connection=MySQLdb.connect(
host="thehost",user="theuser",
passwd="thepassword",db="thedb",
cursorclass = MySQLdb.cursors.SSCursor)
cursor=connection.cursor()
cursor.execute(query)
for row in cursor:
print(row)
答案 1 :(得分:10)
在获取大结果集时肯定使用SSCursor。当我遇到类似问题时,它给我带来了巨大的变化。您可以像这样使用它:
import MySQLdb
import MySQLdb.cursors
connection = MySQLdb.connect(
host=host, port=port, user=username, passwd=password, db=database,
cursorclass=MySQLdb.cursors.SSCursor) # put the cursorclass here
cursor = connection.cursor()
现在,您可以使用cursor.execute()
执行查询,并将光标用作迭代器。
编辑:删除了不必要的本地迭代器,感谢Denis!
答案 2 :(得分:0)
或者,您可以在连接对象外使用SSCursor
(当您已经定义连接并且不希望所有连接都使用SSCursor
作为游标类时,这非常重要。)
import MySQLdb
from MySQLdb.cursors import SSCursor # or you can use SSDictCursor
connection = MySQLdb.connect(
host=host, port=port, user=username, passwd=password, db=database)
cursor = SSCursor(connection)
cursor.execute(query)
for row in cursor:
print(row)