python - ZODB事务提交多次调用__getstate__

标签 python zodb

我正在使用 ZODB 创建一个缓存系统。我放入数据库的对象要求我使用 __getstate____setstate__ 方法,因为它们包含我转换为字符串并存储在 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。

附注 我知道通常您会在完成所有操作后进行提交,但循环表示“缓存”对象中的一系列可能的方法调用,每个方法调用都从 ZODB 添加或检索数据。

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

最佳答案

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

简单的答案是你必须从 persist.Persistent 继承子类。

我想避免这样做(虽然我可以从我所做的一些研究中得到),因为我需要自定义 __getstate____setstate__ 并且我认为继承 Persisted 我必须做一些额外的工作才能使其正常工作。它似乎工作正常,尽管如果我存储的对象稍后发生更改,可能会出现问题(但一旦它们位于 ZODB 中,我就不会更改它们)。

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

关于python - ZODB事务提交多次调用__getstate__,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6684241/

相关文章:

python - 如何在 RelStorage 包中删除 blob?

python - pickle/zodb : how to handle moving . 带有类定义的 py 文件?

python - Tabula 按区域坐标提取表格

python - 将元组字符串转换为 Python 中的元组列表

python - 绘制 100% 堆积图问题

python - 从两个进程访问 ZODB

indexing - Plone - ZODB 目录查询 sort_on 多个索引?

python - Django 的 call_command 因缺少必需参数而失败

python - 如何链接多个全息图中的轴?

python - ZODB/repoze.catalog - 将对象和目录保存在同一数据库中?