我在SqlAlchemy中使用session.merge
将数据插入到带有UniqueConstraint
的表中,这在几个列中很常见,例如,我的ORM类具有以下特性:
UniqueConstraint("attr_1", "attr_2", "attr_3", name="attributes_uix")
我应该使用filter
或filter_by
与_and
一起使用来检查我要插入的数据是否违反了这个唯一约束,还是通过try - except
构造来捕获{}是正确的方法吗?在
Tags:
没有一个sql炼金术专家,但有一段时间都在与这个问题和类似问题作斗争。我不确定在这种情况下是否有唯一正确的方法。我可以为您描述的是在获取db异常和在代码中处理它之间的权衡。在
我个人更喜欢捕捉数据库异常。这样做的好处是不运行额外的查询(有额外的延迟等)。它还具有尽可能重用现有框架部分的优点。在
然而,它有两个真正的缺点。第一个问题可以在数据库设计级别解决,即包含空值的匹配不会违反多列唯一约束。换句话说,如果我有aacnstraint为on(id,value),那么
(1, null), (1, null)
就不能说是非唯一的,因此不会抛出完整性异常。因此,首先值得检查一下是否可以避免这个问题。如果没有,您需要找到一个解决方案,但是PostgreSQL提供了大量的工具(例如,函数索引)。在第二,捕捉IntegrityError是一种生硬的工具,您无法真正解析索引名的任何错误消息,因为这可能因系统而异,并且区域设置可能意味着消息可能会被翻译。所以您依赖于SQLSTATE,这不是很精确。一、 你没有好的机器可读信息。如果有多个候选者,那么将激活哪个约束。在
问题就在这些和重复的代码和查询之间。通常我认为抓住错误是次要的,但由于权衡,这不是一个普遍的建议。在
相关问题 更多 >
编程相关推荐