Как передать субтранзакции в 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