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



我在SqlAlchemy中使用session.merge将数据插入到具有UniqueConstraint的表中,这对于多个列是常见的,例如,我的ORM类具有以下内容:

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

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

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

就我个人而言,我更喜欢捕获数据库异常。这样做的优点是不运行额外的查询(具有额外的延迟等)。它还具有尽可能多地重用现有框架部件的优点。

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

第二,捕获IntegrityError是一种生硬的工具,您无法真正解析任何可用于索引名称的错误消息,因为这可能因系统而异,并且区域设置可能意味着消息可能会被翻译。所以您依赖的是SQLSTATE,这不是很精确。也就是说,你没有好的机器可读信息。如果存在多个候选,则表示哪个约束。

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

相关内容

最新更新