在不解析错误消息的情况下获取有关完整性约束违反错误的信息
Getting information about integrity constraint violation error without parsing error message
我正在使用 SQLAlchemy + psycopg2 构建一个 API 公开数据库。
我想在违反唯一键或外键约束的情况下生成有用的错误消息。比如错误涉及的字段名称。
AFAIU,我应该能够从 PostgreSQL 获取约束名称。这将使我完成从约束名称中获取字段的工作。我现在关注的部分是获取约束名称。
我捕捉到 sqla.exc.IntegrityError
,然后通过 orig
属性访问底层的 psycopg2 异常。例如,它可能是 psycopg2.errors.UniqueViolation
或 psycopg2.errors.ForeignKeyViolation
。
我不知道如何获取有关错误的额外信息。
This answer points to this PostgreSQL doc page 涉及 SQL 语句。
有没有办法让 psycopg2 为我做这些并将这些额外信息添加到异常中?
还有其他获取信息的方法吗?
我是否需要访问某些错误消息并对其进行解析?
编辑:
感谢,我想到了这个(以下示例仅详细说明违反唯一约束):
if isinstance(exc, sqla.exc.IntegrityError):
if isinstance(exc.orig, ppe.UniqueViolation):
# Get table and constraint name from diag info
table_name = exc.orig.diag.table_name
constraint_name = exc.orig.diag.constraint_name
# Inspect DB to get constraint object
inspector = sqla.inspect(db_engine)
unique_constraints = inspector.get_unique_constraints(table_name)
constraint = next(
c for c in unique_constraints
if c['name'] == constraint_name
)
# Get column names from object
column_names = constraint['column_names']
您可以通过e.__cause__.diag.constraint_name
找到约束名称。我从未听说过它,但发现我链接的一个相关问题似乎提供了您需要的信息。
IntegrityError: distinguish between unique constraint and not null violations
还想补充一点,我之前在使用 alembic 时遇到过隐式约束名称问题,因此如果出现这种情况,您可能需要设置约定。我认为这主要与从数据库反射回来有关,但隐式名称可能会导致很难找到相关列。
我正在使用 SQLAlchemy + psycopg2 构建一个 API 公开数据库。
我想在违反唯一键或外键约束的情况下生成有用的错误消息。比如错误涉及的字段名称。
AFAIU,我应该能够从 PostgreSQL 获取约束名称。这将使我完成从约束名称中获取字段的工作。我现在关注的部分是获取约束名称。
我捕捉到 sqla.exc.IntegrityError
,然后通过 orig
属性访问底层的 psycopg2 异常。例如,它可能是 psycopg2.errors.UniqueViolation
或 psycopg2.errors.ForeignKeyViolation
。
我不知道如何获取有关错误的额外信息。
This answer points to this PostgreSQL doc page 涉及 SQL 语句。
有没有办法让 psycopg2 为我做这些并将这些额外信息添加到异常中?
还有其他获取信息的方法吗?
我是否需要访问某些错误消息并对其进行解析?
编辑:
感谢
if isinstance(exc, sqla.exc.IntegrityError):
if isinstance(exc.orig, ppe.UniqueViolation):
# Get table and constraint name from diag info
table_name = exc.orig.diag.table_name
constraint_name = exc.orig.diag.constraint_name
# Inspect DB to get constraint object
inspector = sqla.inspect(db_engine)
unique_constraints = inspector.get_unique_constraints(table_name)
constraint = next(
c for c in unique_constraints
if c['name'] == constraint_name
)
# Get column names from object
column_names = constraint['column_names']
您可以通过e.__cause__.diag.constraint_name
找到约束名称。我从未听说过它,但发现我链接的一个相关问题似乎提供了您需要的信息。
IntegrityError: distinguish between unique constraint and not null violations
还想补充一点,我之前在使用 alembic 时遇到过隐式约束名称问题,因此如果出现这种情况,您可能需要设置约定。我认为这主要与从数据库反射回来有关,但隐式名称可能会导致很难找到相关列。