limone内容类型的zodb持久性。
limone_zodb的Python项目详细描述
limone zodb是Limone的扩展,它生成 可通过zodb持久化。用法与limone相同,只是 decorators和make_content_type函数从limone_zodb导入 包装而不是limone包装:
import colander import limone_zodb import persistent class Friend(colander.TupleSchema): rank = colander.SchemaNode(colander.Int(), validator=colander.Range(0, 9999)) name = colander.SchemaNode(colander.String()) class Phone(colander.MappingSchema): location = colander.SchemaNode(colander.String(), validator=colander.OneOf(['home', 'work'])) number = colander.SchemaNode(colander.String()) class Friends(colander.SequenceSchema): friend = Friend() class Phones(colander.SequenceSchema): phone = Phone() @limone_zodb.content_schema class Person(colander.MappingSchema): name = colander.SchemaNode(colander.String()) age = colander.SchemaNode(colander.Int(), validator=colander.Range(0, 200)) friends = Friends() phones = Phones() jake = Person(name='Jake', age=21) assert isinstance(jake, persistent.Persistent)
基本原理
天真地说,人们可能会假设使用persistent.persistent作为基类 对于内容类型就足够了。但是,你能 发现对内容对象的某些更改无法持久化。例如, 如果不使用limone-zodb,我们可能会做一些类似的事情:
import limone import persistent @limone.content_type(Person) class PersistentPerson(persistent.Persistent): pass jake = PersistentPerson(name='Jake', age=21)
之后,在另一个事务中:
jake.age = 22 # This will persist just fine
如果只更改内容的直接属性 对象,如果更改深层属性,如 上面的例子,这些不一定会自动持续。这不是到期日 任何特定于limone的内容。这种行为可以通过 包含嵌套数据结构的对象。让我们看看这个例子 它不使用limone
import persistent class C(persistent.Persistent): def __init__(self): self.foo = 'Hello' self.bars = ['tiki', 'biker'] o = C()
假设我们已经在zodb中存储了实例 事务,我们可以尝试修改它。如果我们改变o.foo的值 提交我们的交易,新的o副本将写入zodb和我们的 更改将被保存:
import transaction o.foo = 'Howdy' # This change will persist transaction.commit()
另一方面,如果我们将新值添加到o.bars中,则仅此更改 不足以将新值o写入zodb 当事务提交时,更改将不会被持久化:
o.bars.append('lesbian') # Change does not persist transaction.commit()
原因在于persistent.persistent对象如何工作。 persistent.persistent覆盖对象的方法,以便 当在持久对象上设置属性时,该对象将播发到 事务已被更改,并且当 事务已提交。不过,条只是一个普通的老python列表 这对坚持一无所知。改变列表并不能 公布事务的更改,这样zodb就不知道 任何要写入数据库的新内容。
出于同样的原因,更改为仅 涉及嵌套数据结构,将无法向事务播发 发生了变化。如果这些是对一个对象的唯一更改,那么 当事务处理为 坚信的。
limone zodb通过将一个元类传递给normal来解决这个问题 limone内容类型生成过程,确保 在内容的任何级别更改为limone zodbcontent对象 结构,将使更改自动持久化,而不 由开发商跳过的环。
limone zodb的变更日志
0.1a2(2011-08-09)
- 更改了mappingnode的方法解析顺序,以确保 属性赋值时调用limone的setattr。
0.1a1(2011-07-16)
- 初始α释放。