2

rethinkdb我正在尝试学习如何使用 lambda 函数来解决使用and插入表时的冲突python,就像本页上的最后一个示例一样。我想比较andtimestamp之间的一个字段old_docnew_doc保留更新的文档。

r.table(import_table).insert(documents, conflict=lambda id, old_doc, new_doc: new_doc if new_doc['timestamp'] > old_doc['timestamp'] else old_doc).run()```

这给出了以下错误

rethinkdb.errors.ReqlQueryLogicError:预期类型 DATUM 但找到 FUNCTION

我找不到有关此错误或使用 lambda 函数解决冲突的太多文档。运行更简单的东西,例如:

r.table(import_table).insert(documents, conflict=lambda id, old_doc, new_doc: new_doc).run()

给出了同样的错误,这让我觉得我写得不正确。任何帮助,将不胜感激。

4

2 回答 2

1

在我看来,你只是在寻找r.branch

r.table(import_table).insert(
    documents,
    conflict=lambda id, old_doc, new_doc: r.branch(
        new_doc['timestamp'] > old_doc['timestamp'],
        new_doc,
        old_doc
    )     
).run()

如果发生冲突,insert需要一个数据,您只是返回一个函数 (lambda)。在这里,冲突解决 lambda 将返回r.branch比较的结果,这一次将是一个数据。

编辑:

我只是在数据资源管理器中尝试它,在 javascript 中,它适用于我:

r.table('foo').insert(
  [{id: 0, a: 3}, {id: 1, a: 2}],
  {
    conflict: function(id, old_doc, new_doc){
    return r.branch(
      old_doc('a').lt(new_doc('a')),
      new_doc,
      old_doc
    )}
  })

它似乎与我上面给出的python语法相同,不是吗?

于 2016-05-31T20:35:51.903 回答
1

rethinkdb 2.3.0 中实现了插入冲突功能,因此在更新到该版本或更高版本后可以使用。

于 2016-08-11T21:29:34.590 回答