我想从光标读取部分结果然后关闭它而不读取所有结果。 cursor.close()
引发InternalError: Unread result found.
是否可以在不迭代所有结果或使用缓冲区选项的情况下关闭光标?
更新
我的查询获得了大约3000条记录,我的目标是获得符合某些条件的前几条记录。在迭代完部分结果后,我得到了我想要的东西。然后我想放弃未读的结果。我不使用缓冲选项,据我所知,它将立即读取所有结果。此问题与Python MySQL connector - unread result found when using fetchone
不重复def chooseInstrumentsFromOrigin(self, time):
sql = """select symbol, name, total_ratio, outstanding_ratio from market_values
where time = %s order by {captype} asc""".format(captype=self.strategy_data['captype'])
args = [time]
conn = mysql.connector.connect(**mysql_config)
cursor = conn.cursor(dictionary=True)
cursor.execute(sql, args)
# This function will return half way.
symbols = self.chooseInstrumentsFromLeaders(time, cursor)
# I don't want this line!
for i in cursor: pass
cursor.close()
conn.close()
return symbols
答案 0 :(得分:1)
看起来你需要:
cursor = conn.cursor(buffered=True,dictionary=true)
为了放弃中间的结果集。
完全披露,我是一个mysql开发者,而不是一个python开发者。
请参阅Python手册页MySQLConnection.cursor() Method和cursor.MySQLCursorBuffered Class。
立即读取所有行,为true。适用于中小型结果集的幻想。
上面的参考文献指出:
对于使用缓冲游标执行的查询,行获取方法 例如fetchone()从缓冲行集中返回行。对于 非缓冲游标,直到a才从服务器获取行 调用行获取方法。在这种情况下,您必须确保获取 在执行任何其他语句之前,结果集的所有行 相同的连接,或InternalError(找到未读的结果) 异常将被提出。
作为旁注,您可以使用分页修改策略。 MySQL LIMIT clause
通过offset,pageSize设置支持此功能:
[LIMIT {[offset,] row_count | row_count OFFSET offset}]
答案 1 :(得分:1)
您要做的就是在光标中传递buffered = true
。了解更多官方docs
cursor = conn.cursor(buffered=True)