首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在运行转换程序管道时将子事务提交给ZODB?

如何在运行转换程序管道时将子事务提交给ZODB?
EN

Stack Overflow用户
提问于 2015-07-30 18:17:45
回答 1查看 104关注 0票数 1

我将内容导入到Plone中,使用转换管道,但是,有时会出错,异常可能会引发。当发生这种情况时,我需要再次重新启动整个进程,因为事务已经完全中止。这是完全不能接受的,一批超过100,000件。

我使用的是collective.transmogrifier.sections.savepoint部分,但这只能通过使用transaction.savepoint(optimistic=True)来设置保存点。

我想知道这样一个新的部分是否能帮助我解决这个问题:

代码语言:javascript
复制
from zope.interface import classProvides, implements
from collective.transmogrifier.interfaces import ISectionBlueprint
from collective.transmogrifier.interfaces import ISection
import transaction

class CommitSection(object):
    classProvides(ISectionBlueprint)
    implements(ISection)

    def __init__(self, transmogrifier, name, options, previous):
        self.every = int(options.get('every', 1000))
        self.previous = previous

    def __iter__(self):
        count = 0
        for item in self.previous:
            count = (count + 1) % self.every
            if count == 0:
                transaction.commit()
            yield item
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-31 14:23:15

我认为是这样的,下面的代码来自collective.jsonmigrator.partialcommit,它对我来说一直都很好。

您可以始终导入collective.jsonmigrator &当然,可以使用该蓝图,而不是自己编写代码。

代码语言:javascript
复制
class PartialCommit(object):

    classProvides(ISectionBlueprint)
    implements(ISection)

    def __init__(self, transmogrifier, name, options, previous):
        self.previous = previous
        self.step = int(options.get('every', 100))

    def __iter__(self):
        count = 1
        for item in self.previous:
            yield item
            if count % self.step == 0:
                transaction.commit()
            count += 1
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31731206

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档