如何有效地使用MySQLDB SScursor?

时间:2009-11-27 11:12:38

标签: python mysql optimization cursor

我必须处理一个大的结果集(可能是数十万行,有时甚至更多) 不幸的是,它们需要一次性检索(启动时)。

我试图通过使用尽可能少的内存来做到这一点 通过查看,我发现使用SSCursor可能是我正在寻找的,但我仍然不知道如何正确使用它们。

从基础光标或SScursor做一个fetchall()是否相同(根据内存使用情况)?
我可以从sscursor我的行逐个“流动”(或者几个),如果是,则 最好的方法是什么?

3 个答案:

答案 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)