SQLAlchemy中的ID相等性与引用相等性

12
我第一次使用SQLAlchemy,想知道……一般来说,在使用SQLAlchemy时,仅依赖于Python的默认相等语义是否足够,而不是ID(主键)相等性吗?
在我之前参与的其他项目中,使用像Java的Hibernate这样的ORM技术时,我们总是重写.equals()以检查对象的主键/id是否相等,但是回过头看看,我不确定这总是必要的。
在我能想到的大多数情况下,您只需要一个具有给定id的给定对象的一个引用。并且该对象始终是所附加对象,因此从技术上讲,您可以通过引用相等性逃脱。
简短的问题:在使用SQLAlchemy时,我是否应该重写我的业务实体的eq()和hash()?
2个回答

13

简短回答:不需要,除非你使用多个Session对象。

更详细的答案,引用了优秀的文档

这里使用了ORM概念中的身份映射,确保对于一个特定行的所有操作都在同一个Session中进行,从而保证了数据的一致性。一旦Session中存在具有特定主键的对象,该Session上的所有SQL查询都将始终为该特定主键返回相同的Python对象;如果尝试将具有相同主键的第二个已持久化的对象放入会话中,则还将引发错误。


我不理解already-persisted object这部分;无论第二个对象是否已经持久化,它都应该引发错误,对吗? - max

3

我曾遇到几种情况,我的SQLAlchemy应用程序会加载多个相同对象的实例(多线程/不同的SQLAlchemy会话...)。对于这些对象,必须覆盖eq(),否则会出现各种问题。这可能是我的应用程序设计中存在的问题,但最好还是覆盖eq()以确保安全。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接