ZODB等价于有序字典(odict)吗?

3

我正在进行一些PloneFormGen工作。目前,PloneFormGen将输入的表单条目存储为没有关联列信息的元组。如果添加新列(表单字段)则现有数据将变得无效。

可以通过将数据存储在有序字典中来轻松避免这种情况,它保留了输入列顺序和列ID。

ZODB是否具有类似于有序字典的数据类型?如果可能,甚至具有匹配API(Python dict-like item操作和访问)?

4个回答

5
您可以直接使用ZODB中的任何有序字典实现,但是您需要将父对象(引用有序字典实例的对象)标记为已更改,方法是每次更改时使用parent = odict_instance或将_p_changed设置为True。这当然会导致父对象和有序字典实例一起产生一个新的持久记录。
如果您希望有序字典实例自动检测更改,您可能需要构建自己的类,因为我不知道当前是否有任何实现。话虽如此,做到这一点可能非常容易,特别是如果您使用ZODB PersistentMapping类作为构建相同顺序版本的模板。不幸的是,您不能将该类用作mixin,因为它直接引用了UserDict方法,而不是使用super()调用(persistent.Persistent不是新式类)。
Python 2.7在标准库中有一个有序字典类。假设您仍在使用Plone中的Python 2.6,因此您必须将其向后移植。不过,一旦您将其移植回来,PersistentOrderedDict实现应该是从PersistentMapping源代码直接复制的,其中所有UserDict.IterableUserDict实例都替换为您的有序字典端口。

4
您可能需要自己构建类,因为我不知道当前有任何现成的实现。您可以在此处找到基于PersistentDict和OOBtree的ZODB持久化有序dict的实现:https://github.com/bluedynamics/node.ext.zodb/blob/master/src/node/ext/zodb/utils.py 这些实现基于odict包:http://pypi.python.org/pypi/odict由于无法将继承对象的dict类型持久化到ZODB中(因为persistent.Persistent和dict具有不兼容的底层实现),odict提供了一种轻松挂钩不同基类的方法(在整个地方内部使用_dict_impl函数)。这就是为什么odict包仍然被用来代替甚至是python 2.7的顺序dict实现或其他第三方ordereddict实现的原因。

2

Werkzeug和Paste都提供了有序字典。您可以毫无疑问地为您的目的使用pickle。


0
如果一个Python对象可以被pickled,那么它可以在ZODB中持久化。
看一下PersistantMapping,据我所知,应该足以创建一个混合类,就像这样:
class PersistantOrderedDict(PersistantMapping, OrderedDict):

2
PersistentMapping使用对UserDict方法的直接引用,因此有序字典更新方法将被完全绕过。 - Martijn Pieters
@MartijnPieters 你是对的。也许 Persistent 类是更好的方法。 - Fabian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接