sqlalchemy id等同于引用相等

los*_*rje 8 python sqlalchemy

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

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

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

简短的问题:在使用SQLAlchemy时,我是否应该为我的业务实体重写eq()和hash()?

tuo*_*mur 8

简短回答:不,除非您使用多个Session对象.

更长的答案,引用了很棒的文档:

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