5

カーソルから結果の一部を読み取り、すべての結果を読み取らずに閉じたい。すべての結果を反復処理したり、バッファ オプションcursor.close()を使用したりせずにカーソルを閉じることは可能ですか?InternalError: Unread result found.

アップデート:

私のクエリは約 3000 レコードを取得します。いくつかの条件に適合する最初のいくつかのレコードを取得することを目指しています。結果の一部を反復処理した後、必要なものが得られます。次に、未読の結果を破棄したいだけです。私が知っているように、すべての結果をすぐに読み取るバッファオプションは使用しません。この質問はPython MySQL コネクタの重複ではありません - 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
4

2 に答える 2

9

次のものが必要なようです。

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

結果セットを途中で放棄するため。

完全な開示、私はpython開発者ではなく、mysql開発者です。

Python のマニュアル ページMySQLConnection.cursor() メソッドおよびcursor.MySQLCursorBuffered Classを参照してください。

すべての行がすぐに読み取られます。true。小規模から中規模の結果セットに最適です。

上記の後者の参照は次のように述べています。

バッファ カーソルを使用して実行されるクエリの場合、fetchone() などの行フェッチ メソッドは、バッファされた行のセットから行を返します。非バッファ カーソルの場合、行フェッチ メソッドが呼び出されるまで、サーバーから行はフェッチされません。この場合、同じ接続で他のステートメントを実行する前に、必ず結果セットのすべての行をフェッチする必要があります。そうしないと、InternalError (未読の結果が見つかりました) 例外が発生します。

補足として、ページネーションを使用して戦略を変更できます。MySQLLIMIT clauseは、offset,pageSize 設定でこれをサポートします。

[LIMIT {[offset,] row_count | row_count OFFSET offset}]
于 2016-07-13T12:34:22.850 に答える
1

buffered = trueカーソルを渡すだけです。公式ドキュメントをもっと読む

cursor = conn.cursor(buffered=True)
于 2020-02-23T11:05:58.597 に答える