次のコマンドを実行するとします。
insert into hello (username) values ('me')
そして私は
cursor.fetchall()
次のエラーが発生します
psycopg2.ProgrammingError: no results to fetch
クエリが「挿入」または「選択」であることを確認せずに、fetchall()を呼び出すかどうかを検出するにはどうすればよいですか?
ありがとう。
この属性を見てください:
cur.description
クエリを実行すると、行が返されない場合は[なし]に設定され、それ以外の場合はデータが含まれます(例:
(Column(name='id', type_code=20, display_size=None, internal_size=8, precision=None, scale=None, null_ok=None),)
真の例外をオーバーライドしている場合があるため、例外をキャッチすることは理想的ではありません。
だからあなたが尋ねていること現れるは:
PostgreSQLカーソルが与えられた場合、そのカーソルからデータをフェッチする方法はありますか?
私自身の個人的な好みは、単にfetchall()
を実行してから、避けられない例外をキャッチすることです。
try:
data = cursor.fetchall()
do_something_with(data)
except psycopg2.ProgrammingError:
# take some other action
cur.description
を使用して受け入れられた回答は、問題を解決しません。 cur.statusmessage
が解決策になる可能性があります。これにより、SELECT 0
またはINSERT 0 1
が返されます。単純な文字列操作は、最後のクエリを決定するのに役立ちます。
問題は、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になることはありません!