Получение сообщений об ошибках из исключений 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'
есть ли простой метод catch-all, чтобы поймать любое сообщение об ошибке, которое 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()
2 ответов
вы ловите все исключения с базовым классом psycopg2.Error
. Ваша проблема, вероятно, в том, что новые psycopg2 2.5
. Какова ваша версия?
>>> print psycopg2.__version__
2.5.1 (dt dec pq3 ext)
когда я пытаюсь поймать исключения, e.pgerror всегда отсутствует для ошибок подключения. Следующий блок кода обходит это, напрямую печатая "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"
Я понимаю, что этот вопрос является год, но, надеюсь, может помочь кому-то в будущем