【问题标题】:How to access psycopg2 error wrapped in sqlalchemy error如何访问包含在 sqlalchemy 错误中的 psycopg2 错误
【发布时间】:2019-09-26 10:25:10
【问题描述】:

我正在使用 SQLalchemy 和 psycopg2 将 pandas 数据框上传到 Postgres 中的表。如何访问 SQLalchemy 错误中的 psycopg2 错误?

我只想在由于列中的空值违反非空约束而引发错误时将异常写入我的代码。我知道如何使用 psycopg2 测试这个确切的 pSQL 错误,但是当我运行我的代码时,它会返回一个 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 成员那样干净或细粒度。

【问题讨论】:

    标签: python error-handling sqlalchemy psycopg2


    【解决方案1】:

    正如您在问题中指出的那样,您可以通过 SQLAlchemy 异常的 .orig 属性访问 dbapi 引发的底层异常。

    由驱动程序引发并通过 SQLAlchemy 传播的任何异常都由 DBAPIError 的子类包装,它是文档状态:

    包装的异常对象在 orig 属性中可用。 它的 类型和属性是特定于 DB-API 实现的

    (强调我的)

    查看 psycopg 文档以了解他们的基本 Error 他们命名的属性之一是 pgcode

    表示后端返回的错误码的字符串,如果是None 无法使用。 errorcodes 模块包含符号常量 表示 PostgreSQL 错误代码。

    所以,<sqla_exc>.orig.pgcode 看起来应该得到你想要的东西,但是如果出于某种原因 psycopg 没有让他们的代码在他们的异常状态下可用,它并不是 sqlalchemy 可以解决的问题,因为它只是包装了他们的异常并将其传递给您。

    【讨论】:

      【解决方案2】:

      这是我的最终代码供参考:

      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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-06-17
        • 1970-01-01
        • 2017-10-31
        • 1970-01-01
        • 2011-11-11
        • 2020-11-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多