首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ZODB无法提交

ZODB无法提交
EN

Stack Overflow用户
提问于 2011-04-18 22:41:23
回答 2查看 891关注 0票数 2

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

代码语言:javascript
复制
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中出来,第二个time对象就没有被提交。我只有第一个对象。可能的原因是什么。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-04-19 01:31:38

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

但是,如果您使用python字典之类的原始可变对象,则持久性机制无法检测到更改,因为没有写入任何属性。您有三个选项可以解决此问题:

使用持久映射

persistent包包括一个持久化映射类,它基本上是一个持久的python字典实现,通过连接到__setitem__和其他映射钩子来直接检测更改。示例中的root对象基本上是一个持久映射。

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

代码语言:javascript
复制
from persistent.mapping import PersistentMapping
root['layer'] = PersistentMapping()

通过触发钩子强制执行更改检测

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

代码语言:javascript
复制
root['layer'] = root['layer']

将持久对象标记为已更改

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

代码语言:javascript
复制
root._p_changed = 1
票数 5
EN

Stack Overflow用户

发布于 2011-04-18 22:48:57

您可能缺少一个

代码语言:javascript
复制
root['layer']._p_changed = 1

在修改了字典之后。

http://zodb.org/documentation/guide/prog-zodb.html?highlight=_p_changed#modifying-mutable-objects

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5704589

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档