Uncatalog无法找到的对象

时间:2014-12-09 13:41:55

标签: plone zope zodb

我将Plone网站从4.2.x更新为4.3.x并且我收到了很多错误,例如:

INFO plone.app.upgrade Reindex Description index with I18N Case Normalizer
ERROR Zope.ZCatalog reindexIndex could not resolve an object from the uid '/RANDOM/PATH'

检查网站上的路径确实不存在了。

那么如何在实际运行升级之前摆脱这些对象呢?

或者实际上,鉴于升级方法(https://github.com/plone/plone.app.upgrade/blob/master/plone/app/upgrade/v43/alphas.py#L56)基本上覆盖了目录上的所有索引,然后执行以下操作:

catalog.manage_clearIndex([index_id])
catalog.reindexIndex(index_id,aq_get(context, 'REQUEST', None))

我不需要做任何事情,因为manage_clearIndex已经删除了所有内容,reindexIndex只索引那些可以找到的内容吗?

3 个答案:

答案 0 :(得分:1)

似乎问题比看起来更容易解决:你只需要取消编目那个对象即可。

例如,这段代码将执行此操作:

catalog = getToolByName(context, 'portal_catalog')
for brain in catalog(portal_type='Discussion Item'):
    try:
        comment = brain.getObject()
    except KeyError:
        catalog.uncatalog_object(brain.getPath())

来源:http://docs.plone.org/develop/plone/searching_and_indexing/catalog.html

答案 1 :(得分:0)

我刚刚碰到了这个,但由于错误仅在目录查询中使用sort_on='getObjPositionInParent'时出现,所以它有点复杂。

我最后通过解析异常消息并使用以下代码从目录中删除有问题的大脑:

while True:
    try:
        results = catalog(path='/Plone/foo', sort_on='getObjPositionInParent')
    except ValueError as e:
        id_ = e.message.split('"')[1]
        results = catalog(id=id_)
        print 'uncatalogging: {0} ({1} objects)'.format(id_, len(results))
        [catalog.uncatalog_object(b.getPath()) for b in results]
    else:
        print 'done!'
        break

花了一些时间,但最后我能够清理目录。

答案 2 :(得分:0)

对于这些情况,collective.catalogcleanup可能不错。