これは、psycopg2を広範囲に使用した私の最初のプロジェクトです。接続の試行が失敗したときに、psqlエラーメッセージを抽出する方法を見つけようとしています。すべての変数が正しく設定されていれば、以下のコードが機能するかどうかをテストしましたが、エラー条件が発生すると(たとえば、ユーザーが存在しないデータベースを選択した場合)、Python以下:
I am unable to connect to the database
None
Traceback (most recent call last):
File "./duplicate_Finder.py", line 163, in <module>
main(sys.argv[1:])
File "./duplicate_Finder.py", line 142, in main
print e.diag.message_detail
AttributeError: 'OperationalError' object has no attribute 'diag'
接続が失敗したときにpsqlが生成するエラーメッセージをキャッチする単純なキャッチオールメソッドはありますか、または複数のpsycopg2例外のブロックを除いて書き込む必要がありますか?
私のスクリプトから抽出:
import sys, getopt, os, time, csv, psycopg2
...
...
conn_string = "Host=" + dbhost + " dbname=" + database + " user=" + dbuser + " password=" + dbpass
try:
conn = psycopg2.connect(conn_string)
except psycopg2.Error as e:
print "Unable to connect!"
print e.pgerror
print e.diag.message_detail
sys.exit(1)
else:
print "Connected!"
cur = conn.cursor()
cur.execute("SELECT id, lastname, firstname, location FROM test ORDER BY ctl_upd_dttm DESC;")
print cur.fetchone()
...
conn.close()
基本クラスpsycopg2.Error
ですべての例外をキャッチしています。あなたの問題は、おそらくdiag
属性がpsycopg2 2.5
で新しく追加されたことです。あなたのバージョンは何ですか?
>>> print psycopg2.__version__
2.5.1 (dt dec pq3 ext)
例外をキャッチしようとすると、e.pgerrorは接続エラーに対して常にNoneになります。次のコードブロックは、 'e'を直接出力することでこれを回避します。
try:
conn = psycopg2.connect(conn_string)
except psycopg2.OperationalError as e:
print('Unable to connect!\n{0}').format(e)
sys.exit(1)
else:
print('Connected!')
# do stuff
たとえば、パスワード認証が失敗した場合:
Unable to connect!
FATAL: password authentication failed for user "user"
この質問は1年前のものですが、将来的には誰かの助けになると思います
Djangoが原因でここに到達しました