2016-05-31 18 views
2

Ich versuche zu lernen, wie Sie die Lambda-Funktion verwenden, um Konflikte beim Einfügen in eine Tabelle mit rethinkdb und python, wie das letzte Beispiel auf dieser page zu lösen. Ich möchte ein timestamp Feld zwischen old_doc und new_doc vergleichen und das neuere Dokument behalten.RethinkDB einfügen und Konfliktlösung Funktion Syntax

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()``` 

Dies gibt der folgende Fehler

rethinkdb.errors.ReqlQueryLogicError: Expected type DATUM but found FUNCTION

ich nicht viel Dokumentation zu diesem Fehler finden oder Lambda-Funktionen zur Konfliktlösung verwenden. Etwas einfacheres laufen lassen wie:

gibt den gleichen Fehler, der mich denken lässt, dass ich das nicht richtig schreibe. Jede Hilfe wäre willkommen.

Antwort

1

Es scheint mir, dass Sie nur für suchen 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() 

In verrohrten Konflikt insert erwartet ein Datum, eine Funktion (Lambda) nur zurückkehrten. Hier gibt das Konfliktauflösungs-Lambda das Ergebnis des r.branch-Vergleichs zurück, der dieses Mal ein Datum sein wird.

EDIT:

ich versucht, es nur im Daten-Explorer, in Javascript, und es funktioniert für mich:

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 
    )} 
    }) 

Es scheint, die gleiche ist als die Python-Syntax, die ich oben gab, nein ?

+0

Selbst wenn 'r.branch' verwendet wird, bekomme ich den gleichen Fehler. – chacalle

+0

Ich habe gerade Ihr Beispiel genau in den Datenexplorer eingefügt und es wurde der gleiche Fehler wie oben angezeigt. – chacalle

1

Konflikt-Funktion zum Einfügen wurde in rethinkdb 2.3.0 implementiert, so dass dies nach dem Update auf diese Version oder neuer funktioniert.