Как зафиксировать субтранзакции в ZODB при запуске конвейера трансмогрификатора?

Я импортирую контент в Plone, используя конвейер трансмогрификатора, но время от времени что-то может пойти не так, и может возникнуть исключение. Когда это происходит, мне нужно снова перезапустить весь процесс, потому что транзакция полностью прервана. Это просто неприемлемо при партии более 100 000 штук.

Я использую collective.transmogrifier.sections. точка сохранения, но устанавливает точку сохранения только с помощью transaction.savepoint(optimistic=True).

Я хочу знать, поможет ли мне решить проблему новый раздел с чем-то вроде этого:

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

person hvelarde    schedule 30.07.2015    source источник


Ответы (1)


Думаю, да, приведенный ниже код взят из коллективного.jsonmigrator.partialcommit, который всегда работал очень хорошо для меня IIRC.
Вы всегда можете импортировать коллективный.jsonmigrator и использовать этот план, конечно, вместо того, чтобы кодировать свой собственный.

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
person Danimal    schedule 31.07.2015