web-dev-qa-db-ja.com

psycopg2 connection.commit()から影響を受ける行数を取得するにはどうすればよいですか?

現在、Pythonで_psycopg2_を使用してINSERT/UPDATE/DELETEステートメントを実行する次のメソッドがあります。

_def exec_statement(_cxn, _stmt):
    try:
        db_crsr = _cxn.cursor()
        db_crsr.execute(_stmt)
        _cxn.commit()
        db_crsr.close()
        return True
    except:
        return False
_

しかし、boolの代わりに、本当にやりたいことは、トランザクションの影響を受ける行カウントを返すことです。操作が失敗した場合は-1を返します。

_cxn.commit()の影響を受ける行数を取得する方法はありますか?例えば。単一のINSERTの場合、それは常に1になります。DELETEまたはUPDATEの場合、ステートメントの影響を受ける行数などは?

33
amphibient

commit()を使用して行数を取得することはできませんが、cursorを使用して各execute呼び出しの後にその情報を取得できます。 rowcount属性を使用して、SELECTINSERTUPDATE、およびDELETEの影響を受ける行の数を取得できます。

つまり.

    db_crsr = _cxn.cursor()
    db_crsr.execute(_stmt)

    rowcount = db_crsr.rowcount

    _cxn.commit()
    db_crsr.close()

    return rowcount

影響を受けた行の数を返したい場合は、例外をキャッチしないことをお勧めします。操作が本当に失敗した場合(クエリの形式が間違っている、FK制約違反などがある場合)、例外が発生するためです。その場合、呼び出し元はそれをキャッチし、必要に応じて動作できます。 (または、例外処理を集中化する場合は、おそらくraise、カスタムMyPostgresException、または同様のもの。)

-1は、特定の状況( http://initd.org/psycopg/docs/cursor.html#cursor.rowcount )で障害のない場合に返される可能性があるため、使用しないことをお勧めします失敗インジケータとしての値。本当に失敗した場合に数値を返したい場合は、おそらくexceptがそれを返すべきではないので、おそらく-10のような数値を(rowcountブロック内で)返すことができます。

55
khampson