为什么ArangoDB(使用Python-Arango)返回ERR 1600 ERROR_CURSOR_NOT_FOUND?

问题描述 投票:1回答:1

The problem

我遍历整个顶点集合,例如journals,用它来创造边缘,author,从person到给定的journal

我使用python-arango,代码如下:

for journal in journals.all():
    create_author_edge(journal)

我有一个相对较小的数据集,而journals集合只有ca. 1300个文件。但是:这超过1000,这是Web界面中的批量大小 - 但我不知道这是否相关。

问题是它引发了一个CursorNextError,并从数据库返回HTTP 404ERR 1600,这是ERROR_CURSOR_NOT_FOUND error

将通过其id请求游标时引发,但找不到具有该id的游标。

Insights to the cause

ArangoDB Cursor Timeoutthis issue,我怀疑这是因为光标的TTL已经在数据库中过期了,而在python stacktrace中可以看到这样的东西:

# Part of the stacktrace in the error:
(...)
if not cursor.has_more():
    raise StopIteration
cursor.fetch()  <---- error raised here
(...)

如果我快速迭代整个集合,即如果我做print(len(journals.all())它输出“1361”没有错误。

当我用AQL替换journals.all()并增加TTL参数时,它可以正常工作:

for journal in db.aql.execute("FOR j IN journals RETURN j", ttl=3600):
    create_author_edge(journal)

但是,如果没有ttl参数,AQL方法会产生与使用journals.all()相同的错误。

More information

最后一条信息是,当我发现错误时,我正在我的个人笔记本电脑上运行它。在我的工作计算机上,使用相同的代码创建图形并使用相同的数据填充它,但没有引发错误。因为我正在度假,我无法访问我的工作计算机来比较版本,但是这两个系统都是在夏天安装的,因此版本很可能是相同的。

The question

我不知道这是python-arango或ArangoDB的问题。我相信,因为当TTL增加时没有问题,它可能表明ArangodDB而不是Python驱动程序的问题,但我不知道。

(我添加了一个功能请求,将ttl-param添加到.all()-method here。)

有关为什么会发生这种情况的任何见解?


我没有代表创建标签“python-arango”,所以如果有人创建它并标记我的问题会很棒。

python arangodb
1个回答
1
投票

在服务器内部,简单查询将被转换为all()。正如在引用的github问题上所讨论的那样,简单查询不支持TTL参数,并且不会获取它们。

这里的首选解决方案是在客户端上使用SQL-Query,以便您可以指定TTL参数。

通常,您应该避免一次从数据库中提取所有文档,因为这可能会引入其他扩展问题。您应该使用正确的AQL和索引支持的FILTER语句(使用explain()重新验证)来获取所需的文档。

如果需要迭代数据库中的所有文档,请使用分页。这通常通过将范围FILTERLIMIT子句组合来实现最佳方式:

FOR x IN docs
  FILTER x.offsetteableAttribute > @lastDocumentWithThisID
  LIMIT 200
    RETURN x
© www.soinside.com 2019 - 2024. All rights reserved.