我有数十万个基于plone原型(plone 2.5.X)的对象,它们需要将原型模式更新到最新版本。原型模式迁移工具对于数量较少/中等数量的对象非常有用,但它会让我的服务器在尝试迁移所有对象时陷入瘫痪,以至于我总是会终止脚本。我希望能够一次更新一个对象的模式,可能是检索到的对象--这可能吗?如果没有,有没有其他方法来更新大型plone站点中的原型模式?
提前感谢!
发布于 2009-08-05 19:51:46
在深入研究了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_script钩子中,因为这些人通常不会进行大规模的重要模式升级。此外,表单处理是站点中最慢的部分,所以用户体验不会受到太大影响。
它很粗糙,但它不会导致I/O浪费,而且它可以与所有版本的对象一起工作。这个我要了!
发布于 2009-07-28 05:05:40
虽然你没有解释“让它的膝盖”是什么意思,但我会猜你的内存已经用完了。如果是这样,这可能是脚本没有将更改提交到磁盘的问题。在循环中添加一个transaction.commit() (最好通过测试每隔100或1000次执行一次)应该可以解决这个问题。
编辑:所以我错了,这不是记忆问题。似乎原型更新器做了正确的事情。
https://stackoverflow.com/questions/1168977
复制相似问题