2011-11-18 62 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()只是爲了確保。