sqlalchemy id等同于引用相等

时间:2011-11-18 07:24:54

标签: python sqlalchemy

我第一次使用SQLAlchemy并且想知道......一般来说,在使用SQLAlchemy vs id(主键)相等时,依赖python的默认等式语义是否足够?

在我过去使用ORM技术(如Java的Hibernate)的其他项目中,我们总是覆盖.equals()以检查对象的主键/ id是否相等,但当我回头看时我是不确定这总是必要的。

在大多数情况下(如果不是所有情况)我都能想到,您只有一个具有给定id的给定对象的引用。并且该对象始终是附加对象,因此从技术上讲,您可以通过引用相等来逃避。

简短问题:在使用SQLAlchemy时,我是否应该为我的业务实体覆盖 eq ()和哈希()?

2 个答案:

答案 0 :(得分:8)

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

更长的答案,引用了令人敬畏的documentation

  

此处工作的ORM概念称为身份映射,并确保会话中特定行上的所有操作都在同一组数据上运行。一旦具有特定主键的对象出现在Session中,该Session上的所有SQL查询将始终返回该特定主键的相同Python对象;如果尝试在会话中放置具有相同主键的第二个已经持久化的对象,它也会引发错误。

答案 1 :(得分:1)

我有一些情况,我的sqlalchemy应用程序将加载同一对象的多个实例(多线程/不同的sqlalchemy会话......)。绝对有必要为这些对象覆盖eq(),否则我会遇到各种问题。这可能是我的应用程序设计中的一个问题,但是为了确保覆盖eq()可能没什么坏处。