sqlalchemy ID 相等性与引用相等性

12 投票
2 回答
5593 浏览
提问于 2025-04-17 06:34

我第一次使用SQLAlchemy,想问一下……一般来说,在使用SQLAlchemy时,依赖Python默认的相等性判断是否足够,还是说需要用到主键(id)来判断相等呢?

在我之前做的其他项目中,使用像Java的Hibernate这样的ORM技术时,我们总是会重写.equals()方法来检查对象的主键/id是否相等,但回想起来,我不太确定这是否总是必要的。

在我能想到的大多数情况下,给定id的对象只有一个引用。而且那个对象总是附加的对象,所以从技术上讲,你可以只用引用的相等性来判断。

简单的问题是:在使用SQLAlchemy时,我是否应该重写eq()和hash()方法来处理我的业务实体?

2 个回答

3

我遇到过几次情况,在我的sqlalchemy应用中,会加载多个相同对象的实例(因为多线程或者不同的sqlalchemy会话)。为了避免出现各种问题,我必须重写这些对象的eq()方法。如果不这样做,可能会导致一些麻烦。这可能是我应用设计上的问题,但为了保险起见,重写eq()方法也未尝不是个好主意。

13

简单来说:不可以,除非你在使用多个会话对象。

详细解释一下,引用一下很棒的文档

这里的ORM概念叫做身份映射,它确保在一个会话中对某一行的所有操作都使用同一组数据。一旦某个主键对应的对象在会话中存在,所有对这个会话的SQL查询都会返回同一个Python对象;如果试图在会话中放入第二个已经存在的、主键相同的对象,就会报错。

撰写回答