limone内容类型的zodb持久性。

limone_zodb的Python项目详细描述


limone zodbLimone的扩展,它生成 可通过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)

  • 初始α释放。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java如何在Android上的可访问文件夹中创建文件?(非根)   tomcat Unix脚本未使用Process Runtime在Java中运行   模拟器中的java Android AudioTrack速度异常   java是否创建具有特定@ConditionalOnProperty的注释?   java如何使用json数据从gridview中的URL加载图像?(类别和子类别)   ConcurrentHashMap的java锁定值对象   如何在具有额外属性的Java枚举上执行Javadoc?   java如何修复SocketException连接重置问题?   无附加表的java JPA实体继承   java Android应用程序在启动屏幕后崩溃   java如何将Arraylist保存到文件?   java restTemplate从restfull Web服务获取文件数组   java活动带布局隐藏导航栏   socket未接收任何内容的java BufferedReader