在 python2.7 中通过 SqlAlchemy 检查数据库 table 中是否存在唯一值的好方法是什么

What is the good approach to check an existance of unique values in database table by SqlAlchemy in python2.7

我在SqlAlchemy中使用session.merge插入数据到table和UniqueConstraint,这对于几个列来说很常见,例如我的ORM class有以下:

UniqueConstraint("attr_1", "attr_2", "attr_3", name="attributes_uix")

我应该使用 filter 还是 filter_by_and 来检查我要插入的数据是否会违反此唯一约束,或者这是正确的方法要通过 try - except 构造来捕捉 IntegrityError

不是 sql-炼金术专家,但已经为这个问题和类似问题苦苦挣扎了一段时间。我不确定在这种情况下是否只有一种正确的方法。我可以为您描述的是获取数据库异常和在您的代码中处理它之间的权衡是什么。

我个人更喜欢捕获数据库异常。这样做的好处是不会 运行 额外的查询(有额外的延迟等)。它还具有尽可能重用现有框架部分的优势。

但是它有两个真正的缺点。第一个可以在数据库设计级别解决,即包含 NULL 值的匹配不会违反多列唯一约束。换句话说,如果我在 (id, value) 上有 aa cnstraint,那么 (1, null), (1, null) 不能说是非唯一的,因此不会抛出完整性异常。所以首先值得检查一下是否可以避免这个问题。如果没有,您需要找到解决方法,但 PostgreSQL 为您提供了大量工具(例如,功能索引)。

第二个是捕获 IntegrityError 是一种钝器,您无法真正解析可用于索引名称的任何错误消息,因为这可能因系统而异,并且区域设置可能意味着消息可能已被翻译。所以你依赖于 SQLSTATE,这不是很精确。 IE。您没有良好的机器可读信息。如果有多个候选者,关于哪个约束被破坏了。

那么问题就在这些与重复代码和查询之间。通常我认为捕获错误是较小的邪恶,但由于权衡,它不是一个普遍的建议。