2 Вопрос: Как получить доступ к ошибке psycopg2, завернутой в ошибку sqlalchemy

вопрос создан в Wed, May 8, 2019 12:00 AM

Я загружаю фрейм данных pandas в таблицу в Postgres, используя SQLalchemy и psycopg2. Как получить доступ к ошибке psycopg2, содержащейся в ошибке SQLalchemy?

Я хочу записать исключение в мой код только тогда, когда возникает ошибка из-за пустого значения в столбце, которое нарушает ненулевое ограничение. Я знаю, как проверить эту точную ошибку pSQL с помощью psycopg2, но когда я запускаю свой код, он возвращает ошибку SQLalchemy.

Вот ошибка:

  

SQLalchemy.exc.IntegrityError: (psycopg2.errors.NotNullViolation) нулевое значение в столбце ...

Вот необходимое исключение:

from sqlalchemy import exc

try:
    df.to_sql(name='sql_table', con=engine, if_exists='append', index=False)
except exc.IntegrityError:

Вот что я хочу сделать:

from sqlalchemy import exc
import psycopg2

try:
    df.to_sql(name='sql_table', con=engine, if_exists='append', index=False)
except exc.IntegrityError as ex:
    ex = ex.psycopg2error
    if ex.pgcode == '23502'
        print('Data not uploaded: null value in a column violates non-null constraint')
    else:
        raise

Я знаю, что могу проверить sqlalchemy.exc.IntegrityEror.orig, но это не так чисто или мелкозернисто, как при использовании члена pgcode.

    
0
2 ответа                              2                         

Как вы указали в своем вопросе, вы можете получить доступ к базовому исключению, вызванному dbapi, через атрибут .orig исключения SQLAlchemy.

Любое исключение, которое вызывается драйвером и распространяется через SQLAlchemy, заключено в подкласс DBAPIError , где это состояние документа:

  

Обернутый объект исключения доступен в атрибуте orig. Его   тип и свойства зависят от реализации DB-API .

(выделение мое)

Просмотр документов psycopg для их Error атрибуты, которые они называют pgcode:

  

Строка, представляющая код ошибки, возвращенный серверной частью, Нет, если   недоступен. Модуль кодов ошибок содержит символические константы   представляет коды ошибок PostgreSQL.

Итак, <sqla_exc>.orig.pgcode выглядит так, как будто он должен получить то, что вам нужно, но если по какой-то причине psycopg не делает свой код доступным в своем состоянии исключения, на самом деле sqlalchemy не может адресовать его, поскольку он просто оборачивает их исключение и передает это вам.

    
2
2019-05-09 00: 47: 07Z

Вот мой окончательный код для справки:

try:
    df.to_sql(name='sql_table', con=engine, if_exists='append', index=False)
except exc.DBAPIError as ex:
    if ex.orig.pgcode == '23502':
        print("Data could not be uploaded to sql_table: " + ex.orig.diag.message_primary)
    else:
        raise
    
1
2019-05-10 15: 22: 15Z
источник размещен Вот