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

2024-03-29 14:06:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我在SqlAlchemy中使用session.merge将数据插入到带有UniqueConstraint的表中,这在几个列中很常见,例如,我的ORM类具有以下特性:

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

我应该使用filterfilter_by_and一起使用来检查我要插入的数据是否违反了这个唯一约束,还是通过try - except构造来捕获{}是正确的方法吗?在


Tags: and数据namebysqlalchemysessionorm特性
1条回答
网友
1楼 · 发布于 2024-03-29 14:06:24

没有一个sql炼金术专家,但有一段时间都在与这个问题和类似问题作斗争。我不确定在这种情况下是否有唯一正确的方法。我可以为您描述的是在获取db异常和在代码中处理它之间的权衡。在

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

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

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

问题就在这些和重复的代码和查询之间。通常我认为抓住错误是次要的,但由于权衡,这不是一个普遍的建议。在

相关问题 更多 >