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

ele*_*ddy 5 schema plone upgrade archetypes

我有成千上万个基于plone archetypes(plone 2.5.X)的对象需要将他们的原型模式更新到最新版本.原型架构迁移工具非常适合中小型号的对象,但是让我的服务器试图将它们全部迁移到我总是最终杀死脚本的程度.我希望能够一次更新一个对象的模式,可能是检索到的对象 - 这可能吗?如果没有,在大型plone站点中更新原型架构的任何其他方法?

提前致谢!

ele*_*ddy 5

在深入研究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
Run Code Online (Sandbox Code Playgroud)

请注意,这是Plone 2.5.3并且从我通过plone 3挖掘的内容看起来略有不同.对于我已经定制过processForm的一些对象,我在那里执行升级,以便表单可以显示新字段并进行处理.对于其他只是在at_post_edit_script钩子,因为那些通常没有大型重要的架构升级.此外,表单处理是网站中最慢的部分,因此用户体验不会受到太大影响.

它的hacky但它​​不会导致I/O挥霍,它适用于所有版本的对象.我要买它!


Len*_*bro 0

尽管您没有解释“屈膝”是什么意思,但我猜您的内存不足了。如果是这样,这可能是脚本未将更改提交到磁盘的问题。在循环中添加 transaction.commit() (最好进行测试以仅每 100 次或 1000 次执行一次)应该可以解决此问题。

编辑:所以我错了,这不是内存问题。看来原型更新程序做了正确的事情。