Schema 如何在plone中按需更新单个原型对象的模式?

Schema 如何在plone中按需更新单个原型对象的模式?,schema,upgrade,plone,archetypes,Schema,Upgrade,Plone,Archetypes,我有数十万个基于plone原型(plone 2.5.X)的对象,需要将它们的原型模式更新到最新版本。archetype schema迁移工具对于中小型对象非常有用,但它却让我的服务器在尝试迁移所有对象时束手无策,最终我总是会终止脚本。我希望能够一次更新一个对象的模式,可能是检索到的对象-这可能吗?如果没有,还有其他方法来更新大型plone站点中的原型模式吗 提前谢谢 虽然你没有解释“跪下”是什么意思,但我猜你已经没有记忆了。如果是这样的话,这可能是脚本未将更改提交到磁盘的问题。在循环中添加一个t

我有数十万个基于plone原型(plone 2.5.X)的对象,需要将它们的原型模式更新到最新版本。archetype schema迁移工具对于中小型对象非常有用,但它却让我的服务器在尝试迁移所有对象时束手无策,最终我总是会终止脚本。我希望能够一次更新一个对象的模式,可能是检索到的对象-这可能吗?如果没有,还有其他方法来更新大型plone站点中的原型模式吗


提前谢谢

虽然你没有解释“跪下”是什么意思,但我猜你已经没有记忆了。如果是这样的话,这可能是脚本未将更改提交到磁盘的问题。在循环中添加一个transaction.commit()应该可以解决这个问题(最好是每100次或1000次进行一次测试)


编辑:所以我错了,这不是记忆问题。似乎原型更新程序做了正确的事情

在深入研究了2.5目录代码之后,我终于找到了惰性模式更新的答案:

if not self._isSchemaCurrent():
    logging.debug("updating schema for %s"%self.absolute_url())
        try:
            import transaction
            transaction.begin()
            self._updateSchema()
            transaction.commit()
        except Exception, e:
            logging.error('Error updating schema at %s: %s'%(self.absolute_url(), e))
            return False
else:
    logging.debug("schema for %s is up to date"%self.absolute_url())
    return True
请注意,这是Plone 2.5.3,与我在Plone 3中挖掘的内容略有不同。对于一些我已经定制了processForm的对象,我会在那里执行升级,这样表单就可以显示新字段并进行处理。对于其他人来说,只是在at_post_edit_脚本挂钩中,因为这些脚本通常没有非常重要的模式升级。此外,表单处理是网站最慢的部分,因此用户体验不会受到太大影响


它有黑客行为,但不会导致I/O浪费,并且可以处理所有版本的对象。我要了

对不起,误读了你的问题,太快了。archetypes.schemaextender在这方面帮不了你。我已投票删除我的答案。鉴于Lennarts anwer的评论,是否可以添加ZEO客户端并在那里进行迁移?这对站点可用性的影响可能小于托管站点并在同一实例上进行迁移。(假设这就是你目前正在做的。)是的,我目前正在做,但不幸的是数据太多了。它只会导致zeo主机上的mega swap,因此,如果有任何真正的请求传入,则需要很长时间才能获得它所需的任何对象。当然是零星的。2个短请求和5个超长请求。这是一个糟糕的问题,似乎没有一个简单的懒惰升级。如果我对这个过程有更多的了解,我会很乐意写一篇,但它有点神秘。这是令人惊讶的,因为它不符合我所期望的整个灵活的数据。谢谢不幸的是,这不仅仅是内存问题。更新还导致负载(如磁盘IO)显著增加,更重要的是,最终用户将更新的效果视为缓慢,因此我总是手动干预并杀死它。总是有可能发生计划内的停机,但我正试图避免这种情况,因为这是一个愚蠢的模式更新。我刚刚运行了标准的原型工具更新代码,似乎找不到如何更新单个项目,否则我很乐意编写循环并提交。你能举个例子说明你将如何编写这个循环吗?谢谢当然,伊奥会扣球的。您认为您可以在不将数据写入磁盘的情况下对数据库进行大规模更新吗?你似乎没有真正的问题。运行原型升级。当然,当付费客户收到长达数小时的垃圾响应时间或完全停机时,这是一个问题。我认为要求一次升级一个项目是非常公平的,我认为这将是一个简单的答案,只需一小段代码。如果不可能,那就不可能,我会开始考虑其他的选择。我在这里寻找的是代码,而不是关于我的问题是什么的讲座。一次在一个对象上运行升级当然是可能的。升级脚本中提供了这方面的代码,因为该脚本将查找所有对象并逐个进行升级。应该很容易修复。但是,更好的解决方案是实际运行升级并完成升级。这通常在您进行软件升级测试的同一台登台服务器上进行,或者在单独的ZEO客户端上进行,该客户端可以位于单独的服务器上,甚至可以确保生产ZEO客户端不会负载过重。ZODB当然会感觉到,但这是不可避免的。@rjmunro我有自定义的原型代码,我根据需要升级的速度将其放在不同的地方。大多数人把它放在at_post_编辑钩子上。在一种情况下,我希望升级发生在编辑之前,因此我重写了processForm,以便它在编辑之前升级。通过这种方式,我可以将新的模式内容手动添加到编辑表单中,然后不必担心它不会被接受。我也为更新工作流做了类似的事情,只是在这种情况下,我在视图模板顶部调用了一个脚本,该脚本触发了视图更新。如果需要代码示例,请告诉我:)