65

ヒットを返さない sql ステートメントがあります。たとえば、'select * from TAB where 1 = 2'.

返された行数を確認したいのですが、

cursor.execute(query_sql)

rs = cursor.fetchall()

ここで私はすでに例外を取得しています: "(0, 'No result set')"

この例外を回避するにはどうすればよいですか?結果セットが空かどうかを確認してください。

4

9 に答える 9

69

cursor.rowcount通常は 0 に設定されます。

ただし、結果セットを返さないステートメント( 、またはINSERTなしなど) を実行している場合は、 ;を呼び出す必要はありません。そのようなステートメントの結果セットはありません。ステートメントを実行するには、呼び出しで十分です。RETURNINGSELECT ... INTO.fetchall().execute()


-1データベース アダプタは、影響を受ける正確な数を判断できない場合に、行数を に設定することもできることに注意してください。PEP 249Cursor.rowcount仕様を参照してください。

この属性は、カーソルに対して何も実行されてい-1ない場合、.execute*()または最後の操作の行数がインターフェイスによって決定できない場合に使用されます。

sqlite3ライブラリはこれを行う傾向があります。このようなすべての場合で、影響を受ける行数を前もって知る必要がある場合は、COUNT()最初に同じトランザクションで選択を実行します。

于 2013-05-15T09:28:35.897 に答える
27

どんな解決策を試しても、rowcount が常に -1 を返すという問題がありました。

nullの結果をチェックするための次の良い代替品を見つけました。

c.execute("SELECT * FROM users WHERE id=?", (id_num,))
row = c.fetchone()
if row == None:
   print("There are no results for this query")
于 2018-03-30T19:50:08.963 に答える
24

結果セットが空の場合、MySQLdb は例外を発生させません。さらに、cursor.execute() 関数は、フェッチされた結果セットの行数である long 値を返します。したがって、空の結果を確認したい場合は、コードを次のように書き直すことができます。

rows_count = cursor.execute(query_sql)
if rows_count > 0:
     rs = cursor.fetchall()
else:
     // handle empty result set
于 2013-05-15T13:18:21.440 に答える
0

参考までに、 on 、およびステートメントcursor.rowcountのみを返します。CREATEUPDATEDELETE

 |  rowcount
 |      This read-only attribute specifies the number of rows the last DML statement
 |      (INSERT, UPDATE, DELETE) affected.  This is set to -1 for SELECT statements.
于 2020-06-10T12:25:18.090 に答える