1

我尝试在 ndb 事务中运行包含此行的函数。我得到了AttributeError: 'Key' object has no attribute 'reference',我可以看到这是由于这条线。

pipeline = MyPipeline.from_id(pipline_id)

MyPipelinemapreduce.base_handler.PipelineBase(来自 mapreduce 库)的子类。

但这在没有事务的情况下运行良好。是否不可能在 ndb 事务中访问 Pipeline 对象?

4

1 回答 1

2

您可以在事务之前检索管道,并从事务中引用它。

pipeline = MyPipeline.from_id(pipeline_id)

@ndb.transactional(retries=5)
def _tx():
  # do stuff to pipeline
  # ...

_tx()

您看到失败的原因是由于 mapreduce 管道是用 db 实现的,而不是 ndb。

如果由于任何原因获取管道.from_id()失败,代码将引发异常,并且您的事务将不会首先运行 - 这就是您想要的。

使用事务的好处通常是了解更改是否跨一组实体应用于数据存储。获取实体,在这种情况下 - 管道,不是修改任何数据的操作。

于 2013-11-14T01:28:29.397 回答