web-dev-qa-db-ja.com

psycopg2例外からのエラーメッセージの取得

これは、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()
16
sirjames2004

基本クラスpsycopg2.Errorですべての例外をキャッチしています。あなたの問題は、おそらくdiag属性がpsycopg2 2.5で新しく追加されたことです。あなたのバージョンは何ですか?

>>> print psycopg2.__version__
2.5.1 (dt dec pq3 ext)
2
Clodoaldo Neto

例外をキャッチしようとすると、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年前のものですが、将来的には誰かの助けになると思います

23
sdemurjian

Djangoが原因でここに到達しました

0
Loaderon