Python ZODB事务提交调用多次

Python ZODB事务提交调用多次,python,zodb,Python,Zodb,我正在使用ZODB创建一个缓存系统。我放在DB中的对象要求我使用\uuu getstate\uuuuuu和\uuuu setstate\uuuuuuu方法,因为它们包含我转换为字符串并存储在blob中的图像 我没有发现任何人有类似的问题,所以我认为我在做一些愚蠢的事情。通过运行以下测试代码可以看到我遇到的问题: from ZODB import FileStorage, DB from persistent.mapping import PersistentMapping import tran

我正在使用ZODB创建一个缓存系统。我放在DB中的对象要求我使用
\uuu getstate\uuuuuu
\uuuu setstate\uuuuuuu
方法,因为它们包含我转换为字符串并存储在blob中的图像

我没有发现任何人有类似的问题,所以我认为我在做一些愚蠢的事情。通过运行以下测试代码可以看到我遇到的问题:

from ZODB import FileStorage, DB
from persistent.mapping import PersistentMapping
import transaction

class Test(object):
    def __init__(self, a):
        self.a = a

    def __getstate__(self):
        print "Entering getstate for %s" % self.a
        return self.__dict__.copy()

    def __setstate__(self, state):
        print "Entering setstate for %s" % state["a"]
        self.__dict__ = state

print "Creating tests..."
tests = [ Test(i) for i in range(3) ]

print "Connecting to database..."
storage = FileStorage.FileStorage("./test_db.fs", blob_dir="./test_blobs")
db = DB(storage)
conn = db.open()
root = conn.root()
root["cache"] = PersistentMapping()
transaction.commit()

print "Adding tests to db..."
for idx,t in enumerate(tests):
    print "Starting transaction of idx %d" % idx
    root["cache"][idx] = t
    transaction.commit()
其结果是:

Creating tests...
Connecting to database...
Adding tests to db...
Starting transaction of idx 0
Entering getstate for 0
Starting transaction of idx 1
Entering getstate for 0
Entering getstate for 1
Starting transaction of idx 2
Entering getstate for 0
Entering getstate for 1
Entering getstate for 2
正如您可以从输出中看到的,每个事务为之前的每个事务调用getstate方法。这应该发生吗/我错过了什么?我是否完全误解了交易的用途?这样使用PersistentMappings可以吗

我正在使用ZODB 3.10.3和Python 2.6.3

附言。 我知道,通常情况下,在完成所有操作后,您只需执行提交,但循环表示“cache”对象中的一系列可能的方法调用,每个方法调用要么添加数据,要么从ZODB检索数据


感谢您提供的任何帮助或理解。

经过数小时的额外研究和测试,这里是我对自己问题的答案

简单的答案是您必须从persistent.persistent创建子类

我想避免这样做(我认为我可以从我所做的一些研究中避免),因为我需要一个定制的
\uuu getstate\uuuu
\uu setstate\uuuu
,我认为继承持久性必须做一些额外的工作才能使其正常工作。它似乎工作得很好,尽管如果我存储的对象稍后发生更改,可能会出现问题(但一旦它们在ZODB中,我就不会更改它们)


如果有人对我的做法有任何其他建议或警告,我们将不胜感激。感谢您提供的一切。

经过数小时的额外研究和测试,这里是我对自己问题的答案

简单的答案是您必须从persistent.persistent创建子类

我想避免这样做(我认为我可以从我所做的一些研究中避免),因为我需要一个定制的
\uuu getstate\uuuu
\uu setstate\uuuu
,我认为继承持久性必须做一些额外的工作才能使其正常工作。它似乎工作得很好,尽管如果我存储的对象稍后发生更改,可能会出现问题(但一旦它们在ZODB中,我就不会更改它们)

如果有人对我的做法有任何其他建议或警告,我们将不胜感激。谢谢你能提供的一切