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

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

Я использую раздел colle.transmogrifier.sections.savepoint, но это только устанавливает точку сохранения с помощью 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

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
Другие вопросы по тегам