現在、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の場合、ステートメントの影響を受ける行数などは?
commit()
を使用して行数を取得することはできませんが、cursor
を使用して各execute
呼び出しの後にその情報を取得できます。 rowcount
属性を使用して、SELECT
、INSERT
、UPDATE
、および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
ブロック内で)返すことができます。