我正在尝试学习如何使用lambda函数在插入包含rethinkdb
和python
的表时解决冲突,就像此page上的最后一个示例一样。我想比较timestamp
和old_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()
给出了同样的错误,这让我觉得我没有正确地写这个。任何帮助,将不胜感激。
答案 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中实现的,所以这在更新到该版本或更新版本后有效。