运行 transmogrifier 管道时如何将子事务提交给 ZODB?
How to commit subtransactions to the ZODB when running a transmogrifier pipeline?
我正在使用 transmogrifier 管道将内容导入 Plone,但有时会出现问题并引发异常。当发生这种情况时,我需要再次重新启动整个过程,因为事务已完全中止。这对于超过 100,000 件的批次来说是根本无法接受的。
我正在使用 collective.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
我想是的,下面的代码来自 collective.jsonmigrator.partialcommit,它对我 IIRC 一直很有效。
您当然可以随时导入 collective.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
我正在使用 transmogrifier 管道将内容导入 Plone,但有时会出现问题并引发异常。当发生这种情况时,我需要再次重新启动整个过程,因为事务已完全中止。这对于超过 100,000 件的批次来说是根本无法接受的。
我正在使用 collective.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
我想是的,下面的代码来自 collective.jsonmigrator.partialcommit,它对我 IIRC 一直很有效。
您当然可以随时导入 collective.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