我有一个返回125K行的查询。
目标是编写一个在行中迭代的脚本,并为每个行填充第二个表,其中包含根据查询结果处理的数据。
为了开发脚本,我创建了一个重复的数据库,其中包含一小部分数据(4126行)
在小型数据库上,以下代码有效:
import os
import sys
import random
import mysql.connector
cnx = mysql.connector.connect(user='dbuser', password='thePassword',
host='127.0.0.1',
database='db')
cnx_out = mysql.connector.connect(user='dbuser', password='thePassword',
host='127.0.0.1',
database='db')
ins_curs = cnx_out.cursor()
curs = cnx.cursor(dictionary=True)
#curs = cnx.cursor(dictionary=True,buffered=True) #fail
with open('sql\getRawData.sql') as fh:
sql = fh.read()
curs.execute(sql, params=None, multi=False)
result = curs.fetchall() #<=== script stops at this point
print len(result) #<=== this line never executes
print curs.column_names
curs.close()
cnx.close()
cnx_out.close()
sys.exit()
curs.execute(sql, params=None, multi=False)
行在大数据库和小数据库上都成功。如果我在循环中使用curs.fetchone()
,我可以读取所有记录。
如果我更改线路:
curs = cnx.cursor(dictionary=True)
阅读:
curs = cnx.cursor(dictionary=True,buffered=True)
脚本挂在curs.execute(sql, params=None, multi=False)
。
我找不到关于fetchall()的任何限制的文档,也找不到任何增加缓冲区大小的方法,也没有办法告诉我需要多大的缓冲区。
没有任何例外。
我该如何解决此问题?
我也遇到了同样的问题,首先是一个返回约70k行的查询,然后是一个只返回约2k行的查询(对我来说,RAM也不是限制因素)。我从使用mysql.connector(即mysql-connecter-python包)切换到MySQLdb(即mysql-python包),然后能够在大型查询中毫无问题地获取所有()。这两个包似乎都遵循pythonDBneneneba API,所以对我来说,MySQLdb是mysql.connector的一个替代品,除了建立连接的行之外,不需要任何代码更改。YMMV,如果您正在利用mysql.connecter.的特定功能
务实地说,如果你没有特定的理由使用mysql.connector,那么解决方案就是切换到一个效果更好的包!