Синтаксис функции вставки и разрешения конфликтов RethinkDB

Я пытаюсь научиться использовать лямбда-функцию для разрешения конфликтов при вставке в таблицу с rethinkdb и python, как в последнем примере на этом страница. Я хотел бы сравнить поле 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, но найдена ФУНКЦИЯ

Я не могу найти много документации по этой ошибке или использованию лямбда-функций для разрешения конфликтов. Запуск чего-то более простого, например:

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

выдает ту же ошибку, которая заставляет меня думать, что я не правильно это пишу. Любая помощь будет оценена по достоинству.


person chacalle    schedule 31.05.2016    source источник


Ответы (2)


Мне кажется, что вы просто ищете 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 ожидает данные, вы просто возвращали функцию (лямбда). Здесь лямбда разрешения конфликтов вернет результат сравнения 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, который я привел выше, не так ли?

person DevLounge    schedule 31.05.2016
comment
Я только что вставил ваш пример точно в проводник данных, и он вернул ту же ошибку, что и выше. - person chacalle; 01.06.2016

Функция конфликта для вставки была реализована в rethinkdb 2.3.0, поэтому она работает после обновления до этой версии или новее.

person chacalle    schedule 11.08.2016