我有關於SQLAlchemy的問題。我有包含項目的數據庫,每個項目分配了更多記錄(1:n)。記錄部分存儲在數據庫中,但它在文件系統上也有一個分配的文件(1:1)。SQLAlchemy的 - MapperExtension.before_delete不叫
我想要做的是當記錄從數據庫中刪除,刪除指定的文件。所以我寫了下面MapperExtension:
class _StoredRecordEraser(MapperExtension):
def before_delete(self, mapper, connection, instance):
instance.erase()
下面的代碼創建了一個實驗裝置(完整的代碼是在這裏:test.py):
session = Session()
i1 = Item(id='item1')
r11 = Record(id='record11', attr='1')
i1.records.append(r11)
r12 = Record(id='record12', attr='2')
i1.records.append(r12)
session.add(i1)
session.commit()
最後,我的問題...下面的代碼工作O.K.和old.erase()
方法被稱爲:
session = Session()
i1 = session.query(Item).get('item1')
old = i1.records[0]
new = Record(id='record13', attr='3')
i1.records.remove(old)
i1.records.append(new)
session.commit()
但是,當我換一個新記錄到record11
,這已經是在數據庫的id
,但它是不一樣的項目(attr=3
),的old.erase()
不調用。有人知道爲什麼嗎?
由於
作品(SQLAlchemy的0.5.6),即old.erase()被調用。但由於記錄實際上已更新,因此不會以未更改的代碼進行調用。 – 2009-09-30 08:02:20