2011-11-18 66 views
6

我正在使用SQLAlchemy第一次,并想知道...一般来说,它足以依靠python的默认平等语义时使用SQLAlchemy与id(主键)相等?我们总是重写.equals()来检查对象的主键/标识符是否相等,但是当我回头看看时,我会发现,米不知道这是必要的。sqlalchemy id相等与参考相等

在大多数情况下(如果不是所有情况下我都能想到),您只有一次对具有给定id的给定对象的引用。而且这个对象总是附属的对象,所以在技术上你可以通过引用平等逃脱。

短的问题:我应该使用SQLAlchemy的时候会改写EQ()和散列()为我的企业实体?

回答

6

简答:不,除非您使用多个会话对象。

再回应,引述真棒documentation

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

+0

我不明白'already-persisted object'部分;不应该引发第二个对象是否已经存在的错误? – max

1

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