2016-12-12 12 views
0

小さなスクリプトでpython mysqlコネクタを使用しています。私が直面している問題は、0行を返すselect文を実行するときにカーソルを閉じることができないことです。カーソルを閉じると、 "mysql.connector.errors.InternalError:Unread result found"がトリガされます。しかし、fetchall()を呼び出すと、「mysql.connector.errors.InterfaceError:結果がフェッチ元に​​設定されません」という結果になります。エラー。Pythonのmysqlコネクタで空のデータセットを正しく処理する方法は?

基本的には、未読データのためにカーソルを閉じることができず、読み取るデータがないためデータを読み取ることができません。

+0

'try' /' except'を使うのはどうですか? – Andersson

+0

次に、次回新しいカーソルを開くために接続を使用するときにエラーが発生します。 – Trinopoty

答えて

0

何について:

if cur.rowcount: 
    cur.fetchall() 
else: 
    #whatever you want to do 
+0

これは、カーソルをきれいに閉じるのに役立ちません。 – Trinopoty

0

私は空のSQLのに対処するため、このロジックを使用:

import MySQLdb 
cursor = db.cursor() 
sql = "SELECT * FROM foobar" 
dta = cursor.execute(sql) 
if dta == 0: 
    print "0 MySQL Entries found" 
    cursor.close() 

私が正しくあなたの質問を理解すると仮定すると、あなたは、W/Eの理由で、カーソルをクローズすることはできません。あなたは、単にカーソルを再度割り当てることによって、それを閉じずに、カーソルを「位置直す」ことができます。

cursor = db.cursor() 
doStuff() 
+0

私は "MySQLdb"ではなく公式のMySQLコネクタを使用しています。そして、私は同じエラーを投げるだけなので、現在のカーソルを閉じずに2番目のカーソルを作成することはできません。 – Trinopoty

0

これは、この質問にしばらくしているが、私はとにかく見つけ解決策を投稿します。

Pythonに公式のmysqlコネクタを使用すると、要求されるまでサーバから行がフェッチされません。その結果、行が残っている場合は、接続をクローズしようとすると例外がスローされます。 1つの選択肢は、バッファリングされたカーソルを使用することです。バッファー・カーソルはサーバーからすべての行を読み取り、カーソルはいつでも閉じることができます。しかし、この方法にはメモリコストが伴います。

mysqlコネクタの接続ごとに1つのオープンカーソルがハードな制限があります。別のカーソルを開こうとすると例外が発生しました。

関連する問題