【发布时间】:2012-09-27 23:43:27
【问题描述】:
我有一个 ZODB 安装,我必须在其中组织几百万个大约几种不同类型的对象。我有一个通用容器类Table,它包含 BTree,用于按属性或这些属性的组合索引对象。数据一致性非常重要,因此我想强制执行,当我写入索引覆盖的任何属性时,索引会自动更新。所以一个简单的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 类时,尚未创建数据库和其中的对象。所以正如nice answer 中提到的,我可能必须创建一些单例查找机制来查找Table 对象,而不是将它们作为实例化参数交给Property。有没有更优雅的方式?保留描述符本身?欢迎任何建议和最佳实践示例!
【问题讨论】:
标签: python indexing consistency zodb