我有一個ZODB安裝,我必須組織好幾百萬個關於幾種不同類型的對象。我有一個通用容器類Table
,其中包含BTrees通過屬性或這些屬性的組合對對象進行索引。數據一致性是非常重要的,所以我想強制執行,當我寫入任何屬於索引的屬性時,索引會自動更新。因此,一個簡單的obj.a = x
應該足以計算所有新的從屬索引條目,檢查是否有任何衝突,最後寫入索引和值。ZODB中具有可變屬性的對象的一致索引
總的來說,我很樂意爲此使用一個庫,所以我在尋找repoze.catalog和IndexedCatalog,但是對此並不滿意。 IndexedCatalog似乎已停用了一段時間,並沒有爲對象的更改提供一致性。據我所知,repoze.catalog似乎更加使用和活躍,但也沒有提供這種一致性。如果我在這裏錯過了一些東西,我很樂意聽到它,並且喜歡重複使用。
所以,除了試圖找到問題的庫之外,我不得不攔截對描述符的數據對象屬性的寫入訪問,並讓類改變索引的神奇。爲此,描述符實例必須知道,他們必須與哪個Table
實例交談。當前實現成纔去這樣的:
class DatabaseElement(Persistent):
name = Property(constant_parameters)
...
class Property(object):
...
def __set__(self, obj, name, val):
val = self.check_value(val)
setattr(obj, '_' + name, val)
當生成這些DatabaseElement
類,數據庫和內對象尚未創建。所以正如在nice answer中提到的那樣,我可能必須創建一些單例查找機制來查找Table
對象,而無需將它們作爲實例化參數傳遞給Property
。有沒有更優雅的方式?堅持描述符本身?任何建議和最佳實踐示例歡迎!