Получение сообщений об ошибках из исключений 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()

person sirjames2004    schedule 20.06.2014    source источник


Ответы (4)


Вы перехватываете все исключения с помощью базового класса psycopg2.Error. Ваша проблема, вероятно, в том, что атрибут diag является новым в psycopg2 2.5. Какова ваша версия?

>>> print psycopg2.__version__
2.5.1 (dt dec pq3 ext)
person Clodoaldo Neto    schedule 20.06.2014
comment
››› import psycopg2 ››› print psycopg2.__version__ 2.0.14 (dt dec ext pq3) Похоже, я отстал на несколько версий. К сожалению, похоже, что это самая последняя версия согласно репозиториям моего дистрибутива (Scientific Linux) + epel. Возможно, придется пойти исходным маршрутом с этим файлом . . . - person sirjames2004; 20.06.2014
comment
Просто любопытно, прежде чем я приступлю к потенциально опасному поиску ручного обновления psycopg2, есть ли способ получить сообщения об ошибках подключения psql в более старых версиях psycopg2, или я застрял, просто давая им общее сообщение, когда что-то идет не так? - person sirjames2004; 21.06.2014
comment
@sirjames2004 Не знаю. Но установить с помощью setup или pip довольно просто: initd.org/psycopg/install. Только не забудьте сначала yum remove psycopg2. - person Clodoaldo Neto; 21.06.2014
comment
@sirjames2004 И вам нужен Python 2.5+ для psycopg 2.5 - person Clodoaldo Neto; 21.06.2014

Когда я пытаюсь поймать исключения, 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"

Я понимаю, что этому вопросу уже год, но, надеюсь, он может помочь кому-то в будущем.

person sdemurjian    schedule 17.08.2015

Оказался здесь из-за

класс 'psycopg2.errors.InvalidCursorName'

на Джанго. Если это ваш случай, обязательно сделайте миграции

person Loaderon    schedule 10.03.2020
comment
Спасибо @Loaderon! - person Craig Anderson; 10.12.2020

Начиная с Python 3.9 (.removesuffix(), f-строки) я использую

except psycopg2.Error as e:
  log.error(f"{type(e).__module__.removesuffix('.errors')}:{type(e).__name__}: {str(e).rstrip()}")
  if conn: conn.rollback()

где log — это регистратор.

Ошибки подключения находятся непосредственно в модуле psycopg2, а синтаксические ошибки — в подмодуле psycopg2.errors. В конце каждого сообщения об ошибке psycopg2 есть ненужная новая строка.

person Hans Ginzel    schedule 15.03.2021