gpt4 book ai didi

python - ZODB 无法提交

转载 作者:行者123 更新时间:2023-11-28 22:05:07 25 4
gpt4 key购买 nike

我是第一次使用 ZODB。只是尝试使用 FileStorage 提交数据。但是当我第二次执行相同的脚本时,我无法提交新对象。这是我的脚本

from ZODB import FileStorage,DB
import transaction
storage = FileStorage.FileStorage('/tmp/test.fs')
db = DB(storage)
conn = db.open()
root = conn.root()
#root['layer']={}
root['layer']['2b']={"id":'2b','name':'some name'}
transaction.commit()
conn.close()
db.close()
storage.close()

当我再次重复代码时,仅更改 id root['layer']['2c'] 并从 python 中出来,第二次对象没有被提交。我只有第一个对象。可能是什么原因。

最佳答案

ZODB 持久层通过挂接到 python __setattr__ 钩子(Hook)来检测更改,每次设置属性时将持久对象标记为已更改。

但是如果你使用像 python 字典这样的原始可变对象,那么持久性机制就没有办法检测到变化,因为没有写入属性。您可以通过三个选项来解决此问题:

使用持久映射

persistent 包包括一个持久映射类,它基本上是一个 python 字典实现,它是持久的,并通过挂接到 __setitem__ 和其他映射 Hook 直接检测变化。您示例中的 root 对象基本上是一个持久映射。

要使用,只需将所有字典替换为持久映射:

from persistent.mapping import PersistentMapping
root['layer'] = PersistentMapping()

通过触发钩子(Hook)强制进行变更检测

您可以再次设置键,或者在持久对象上,再次设置属性以强制更改对象:

root['layer'] = root['layer']

将持久对象标记为已更改

您可以在最近的持久对象上设置 _p_changed 标志。您的根对象是您拥有的唯一持久对象,其他所有对象都是 Python 字典,因此您需要将其标记为已更改:

root._p_changed = 1

关于python - ZODB 无法提交,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5704589/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com