10.6.1 类 cursor.MySQLCursorBuffered
执行查询后,MySQLCursorBuffered游标标从服务器获取整个结果集和并将他们放在缓冲区中。
执行查询使用buffered游标时 ,取行方法如fetchone()返回的是缓冲区中的行。nonbuffered游标,将不从服务器获取数据,直到你调用了某个取数据行的方法(这里应该是指fetch开头的一些方法,如fetchone(),fetchall()等)。在使用nonbuffered游标时,你必须确保取出结果集中的所有行,才能再用同一连接执行其他语句在,否则会提高InternalError(Unread result found)异常发生的概率。
Buffered游标适用于你需要进行多个小结果集的查询,且多个结果集之间的数据需要一起使用。
如果你需要创建buffered游标,调用连接的cursor()方法时需要使用buffered参数(查了一些文档这个参数是一个没默认参数,默认值为False)。另外,你也可以通过设定连接参数,来将所有通过该连接创建的游标默认置为buffered=true
方法一:
config={'host':'127.0.0.1',#default localhost
'user':'root',
'password':'buaascse',
'port':3306 ,#默认即为3306
#'database':'mobilephone', 无默认数据库
'charset':'utf8',#默认即为utf8
'buffered': True,
}
try:
cnn = mysql.connector.connect(**config)
except mysql.connector.Error as e:
print('connect fails!{}'.format(e))
方法二:
import mysql.connector
cnx = mysql.connector.connect()
# 只有这个特定的游标可以将结果放入缓冲区
cursor = cnx.cursor(buffered=True)
# 所有通过cnx2连接创建的游标都没默认为buffered游标
cnx2 = mysql.connector.connect(buffered=True)
这么做是把结果集缓存在服务器端,不知道数据量太大请求太多的时候会不会造成服务器端负荷过大卡死的情况。不过对于本地小项目来说肯定是没啥影响。
最终问题是这样解决的,将游标置为buffered,然后分多次从数据库中读取数据并处理。