Python mysql.connector InternalError:关闭游标时发现未读结果

时间:2016-07-13 11:44:26

标签: python mysql mysql-connector-python

我想从光标读取部分结果然后关闭它而不读取所有结果。 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

2 个答案:

答案 0 :(得分:1)

看起来你需要:

cursor = conn.cursor(buffered=True,dictionary=true)

为了放弃中间的结果集。

完全披露,我是一个mysql开发者,而不是一个python开发者。

请参阅Python手册页MySQLConnection.cursor() Methodcursor.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)