RethinkDB插入和冲突解决函数语法

时间:2016-05-31 18:23:54

标签: rethinkdb rethinkdb-python

我正在尝试学习如何使用lambda函数在插入包含rethinkdbpython的表时解决冲突,就像此page上的最后一个示例一样。我想比较timestampold_doc之间的new_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()

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

2 个答案:

答案 0 :(得分: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语法相同,没有?

答案 1 :(得分:1)

插入的冲突功能是在rethinkdb 2.3.0中实现的,所以这在更新到该版本或更新版本后有效。