web-dev-qa-db-ja.com

psycopg2カーソルからフェッチするかどうかを検出しますか?

次のコマンドを実行するとします。

insert into hello (username) values ('me')

そして私は

cursor.fetchall()

次のエラーが発生します

psycopg2.ProgrammingError: no results to fetch

クエリが「挿入」または「選択」であることを確認せずに、fetchall()を呼び出すかどうかを検出するにはどうすればよいですか?

ありがとう。

10
moeseth

この属性を見てください:

cur.description

クエリを実行すると、行が返されない場合は[なし]に設定され、それ以外の場合はデータが含まれます(例:

(Column(name='id', type_code=20, display_size=None, internal_size=8, precision=None, scale=None, null_ok=None),)

真の例外をオーバーライドしている場合があるため、例外をキャッチすることは理想的ではありません。

17
Chris B

だからあなたが尋ねていること現れるは:

PostgreSQLカーソルが与えられた場合、そのカーソルからデータをフェッチする方法はありますか?

私自身の個人的な好みは、単にfetchall()を実行してから、避けられない例外をキャッチすることです。

try:
    data = cursor.fetchall()
    do_something_with(data)
except psycopg2.ProgrammingError:
    # take some other action
4
holdenweb

cur.descriptionを使用して受け入れられた回答は、問題を解決しません。 cur.statusmessageが解決策になる可能性があります。これにより、SELECT 0またはINSERT 0 1が返されます。単純な文字列操作は、最後のクエリを決定するのに役立ちます。

0
Tirtha R

問題は、Noneであることが判明したのはcur.fetchone()の結果であるということです。したがって、ループを停止する方法は次のとおりです。

cursor.execute("SELECT * from rep_usd")
output = cursor.fetchone()
while output is not None:
    print(output)
    output = DBCursor.fetchone()

cursor.descriptionがNoneになることはありません!

0
Alvaro Torijano