python - 在不解析错误消息的情况下获取有关完整性约束违规错误的信息
问题描述
我正在使用 SQLAlchemy + psycopg2 构建一个公开数据库的 API。
我想在违反唯一或外键约束的情况下生成有用的错误消息。就像错误中涉及的字段的名称一样。
AFAIU,我应该能够从 PostgreSQL 获取约束名称。这将使我从约束名称中获取字段的工作。我现在关注的部分是获取该约束名称。
我 catch ,然后通过属性sqla.exc.IntegrityError
访问底层 psycopg2 异常。orig
例如,它可能是 apsycopg2.errors.UniqueViolation
或 a psycopg2.errors.ForeignKeyViolation
。
我不知道如何获得有关该错误的额外信息。
这个答案指向这个涉及 SQL 语句的PostgreSQL 文档页面。
有没有办法让 psycopg2 为我执行此操作并将这些额外信息添加到异常中?
有没有其他方法可以获取信息?
我是否需要访问一些错误消息并对其进行解析?
编辑:
感谢@Ian Wilson 的回答,我想出了这个(以下示例仅详细说明违反唯一约束):
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
。我从未听说过它,但发现我链接的一个相关问题似乎提供了您需要的信息。
还想补充一点,我之前在使用 alembic 时遇到了隐式约束名称的问题,因此如果出现这种情况,您可能需要设置约定。我认为这主要与从数据库反射回来有关,但隐含的名称可能会使查找相关列变得困难。
推荐阅读
- react-native - 无法使用本机代码创建项目
- android - 使用 Xamarin.Forms 和 Azure 推送通知:设备未注册
- gpu - 允许所有用户运行 nvidia-smi 权限
- r - R,将日期设置为通用日期和星期几
- python - 在 TensorFlow 中使用多个 CPU 内核
- r - 从带有表单的页面中抓取数据
- python - 使用 pandas 从每个组中随机选择一行
- java - 在 IoC 容器中将依赖项设置为 NULL 并在运行时提供依赖项是一种不好的做法吗?
- python - python正则表达式匹配具有多个分隔符的字符串中的六位数字
- java - Fabric8 java库编辑现有资源