我有一个 ZODB 安装,我必须在其中组织几百万种不同类型的对象。我有一个通用容器类Table
,它包含 BTrees 来按属性或这些属性的组合索引对象。数据一致性非常重要,因此我想强制执行,当我写入索引覆盖的任何属性时,索引会自动更新。所以一个简单的obj.a = x
应该足以计算所有新的依赖索引条目,检查是否有任何冲突,最后写入索引和值。
一般来说,我很乐意为此使用库,所以我查看了repoze.catalog和IndexedCatalog,但对此并不满意。IndexedCatalog 似乎已经死了很长一段时间,并且没有为对象的更改提供那种一致性。据我所知, repoze.catalog 似乎更常用和更活跃,但也没有提供这种一致性。如果我在这里错过了什么,我很想听听它,并且更喜欢重用而不是重新发明。
所以,除了试图为问题找到一个库之外,我如何看待它,我必须拦截对具有描述符的数据对象属性的写访问,并让Table
类执行更改索引的魔法。为此,描述符实例必须知道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
类时,尚未创建数据库和其中的对象。因此,正如在这个不错的答案中提到的,我可能必须创建一些单例查找机制来查找Table
对象,而不是将它们Property
作为实例化参数。有没有更优雅的方式?保留描述符本身?欢迎任何建议和最佳实践示例!