web-dev-qa-db-ja.com

Python、結果セットが空かどうかを確認する方法は?

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

返される行数を確認したい

cursor.execute(query_sql)

rs = cursor.fetchall()

ここで私はすでに例外を受け取ります: "(0、 '結果セットなし')"

結果セットが空かどうかを確認するには、どうすればこの例外を防ぐことができますか?

31
Tao Venzke

_cursor.rowcount_は通常0に設定されます。

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


データベースアダプタは、影響を受ける正確なカウントを特定できない場合、行カウントを_-1_に設定することもできます。 PEP 249 _Cursor.rowcount_仕様 を参照してください:

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

_sqlite3_ library はこれを行う傾向があります。そのような場合、影響を受ける行数を事前に知る必要がある場合は、最初に同じトランザクションでCOUNT() selectを実行します。

41
Martijn Pieters

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

rows_count = cursor.execute(query_sql)
if rows_count > 0:
     rs = cursor.fetchall()
else:
     // handle empty result set
12
thavan

どのような解決策を試しても、行数が常に-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")
8
Piney

注意:これはPythonのMySQLdbモジュール用です。

SELECTステートメントの場合、空のレコードセットの例外はありません。 cursor.fetchall()の場合は空のリスト(_[]_)、_cursor.fetchone()の場合はNoneのみ。

その他の声明については、例えばINSERTまたはUPDATEは、レコードセットを返しません。カーソルでfetchall()fetchone()も呼び出すことはできません。そうでない場合、例外が発生します。

上記の2種類のカーソルを区別する方法が1つあります。

_def yield_data(cursor):
    while True:
        if cursor.description is None:
            # No recordset for INSERT, UPDATE, CREATE, etc
            pass
        else:
            # Recordset for SELECT, yield data
            yield cursor.fetchall()
            # Or yield column names with
            # yield [col[0] for col in cursor.description]

        # Go to the next recordset
        if not cursor.nextset():
            # End of recordsets
            return
_
4
Rockallite

postgresデータベースに接続している場合、次のように機能します。

result = cursor.execute(query)

if result.returns_rows:
    # we got rows!
    return [{k:v for k,v in Zip(result.keys(), r)} for r in result.rows]
else:
    return None
0
Ryan Tuck

あなたはこのようにすることができます:

count = 0
cnxn = pyodbc.connect("Driver={SQL Server Native Client 11.0};"
                      "Server=serverName;"
                      "Trusted_Connection=yes;")
cursor = cnxn.cursor()
cursor.execute(SQL query)
for row in cursor:
    count = 1
    if true condition:
        print("True")
    else:
        print("False")
if count == 0:
    print("No Result")

ありがとう:)

0