Python ZODB无法提交

Python ZODB无法提交,python,zodb,Python,Zodb,我第一次使用ZODB。只是尝试用文件存储提交数据。但是,当我第二次执行相同的脚本时,我无法提交新对象。这是我的剧本 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']['2

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

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根['layer']['2c']并从python中出来,第二次对象就没有提交。我只有第一个目标。原因可能是什么

您可能缺少一个

root['layer']._p_changed = 1
修改了格言之后


ZODB持久性层通过挂接到python _usetattr _;钩子来检测更改,每次设置属性时都将持久性对象标记为已更改

但是如果您使用一个基本的可变对象,比如python字典,那么持久性机制就无法检测到更改,因为没有编写属性。您有三个解决此问题的选项:

使用持久映射 persistent包包括一个persistent映射类,它基本上是一个python字典实现,它是持久的,通过挂接到uuu setitem_uuuu和其他映射挂钩直接检测更改。示例中的根对象基本上是一个持久映射

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

from persistent.mapping import PersistentMapping
root['layer'] = PersistentMapping()
通过触发挂钩强制进行更改检测 您可以重新设置键,或者在持久对象上,重新设置属性以强制更改对象:

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

root._p_changed = 1

谢谢Martin,通过设置_p_changed=1,我可以存储新的dictionary对象。我还将介绍PersistentMapping。