2016-10-05 2 views
1

Ich möchte eine Entität zurückziehen und gleichzeitig das Attribut db/txInstant angeben, aber ich kann dies nicht zum Funktionieren bringen. das Unternehmen zurückzieh sieht wie folgt aus (und das funktioniert):Entity mit einem bestimmten db/txInstant in Datomic zurückziehen?

[[:db.fn/retractEntity [:person/email "[email protected]"]]] 

ich verschiedene Möglichkeiten, um auch zu liefern die db/txInstant Attribut, zum Beispiel versucht haben:

[[:db.fn/retractEntity [:person/email "[email protected]"]] 
[:db/txInstant <inst>]] 

aber nicht mit:

Caused by: datomic.impl.Exceptions$IllegalArgumentExceptionInfo: :db.error/not-a-data-function Not a data function: 50 
at datomic.error$arg.invoke (error.clj:57) 
    datomic.error$arg.invoke (error.clj:55) 
    datomic.db.Db.getFn (db.clj:1794) 
    datomic.db.ProcessExpander.inject (db.clj:2473) 
    datomic.db.ProcessInpoint.inject (db.clj:2372) 
    datomic.db$with_tx$inject_all__2222$fn__2223.invoke (db.clj:2535) 
    clojure.lang.PersistentVector.reduce (PersistentVector.java:341) 
    clojure.core$reduce.invokeStatic (core.clj:6544) 
    clojure.core$reduce.invoke (core.clj:6527) 
    datomic.db$with_tx$inject_all__2222.invoke (db.clj:2535) 
    datomic.db$with_tx.invoke (db.clj:2539) 
    datomic.peer.LocalConnection/fn (peer.clj:557) 
    datomic.peer.LocalConnection.transactAsync (peer.clj:557) 
    datomic.peer.LocalConnection.transact (peer.clj:549) 
    datomic.api$transact.invoke (api.clj:94) 
    .... 

Also meine Frage ist einfach, wie kann ich das db/txInstant Attribut beim Zurückziehen einer Entität in Datomic angeben?

+0

Was ist der Anwendungsfall dafür? Wenn Sie die Entität finden, die Sie mit ': person/email' zurückziehen möchten, brauchen Sie auch nicht': db/txInstant' anzugeben. –

+0

Der Grund, warum ich dies tun möchte, ist in der Lage zu später Abfrage, wenn ein Attribut zurückgezogen wurde. "Wann" sollte nicht die Systemzeit des Servers sein, auf dem Datomic ausgeführt wird, sondern eine Zeit, die von der Anwendung bestimmt wird. Also ich denke, dass ich dies als txinstant Zeit angeben möchte. – Johan

+0

Leider ist Datomic nicht so zu betreiben. TxInstant ist nur die aktuelle UTC-Zeit, die von der Computeruhr gelesen wird, wenn die Transaktion stattfindet. –

Antwort

2

Dies funktioniert für mich:

(d/transact conn [{:db/id  #db/id [:db.part/tx] 
        :db/txInstant #inst "2016-10-29"} 
        [:db.fn/retractEntity [:person/email "[email protected]"]]]) 
1

txInstant, wie ich es verstehe, ist die Zeit, dass die Transaktion die Änderung, sei es Rückzug oder Addition, passiert. Also, wenn Sie, wo dies gelingt dabei Sie sagen, im Wesentlichen der transactior:

„Hallo Transaktor bitte eine Transaktion erstellen jetzt passiert ist, dass irgendwann andere dann jetzt“

die in allen anderen Zeit Semantik brechen die DB. Aus diesem Grund verwenden wir normalerweise Namespace-Schlüsselworte in Datomic.

Anstelle der Einstellung :db/txInstant Satz :my.company.db/txInstant. Auf diese Weise können Sie sowohl den Zeitpunkt der Transaktion herausfinden, wie von Ihrer Transaktion bestimmt, und der Rest des Systems kann feststellen, wann der Transaktor die Transaktion erstellt hat, was Dinge wie den Ereignisstrom glücklich machen wird.

+0

Ich verstehe, dass dies besser wäre, das Problem ist, dass ich Sie müssen die (History) -Datenbank wie folgt abrufen: my.company.db/txInstant. Mir ist nur bewusst, dass Sie die DB erhalten können: db/txInstant. Ich habe eine separate Frage dazu, auf die ich keine befriedigende Antwort habe: http: // stackoverflow.com/questions/39287619/use-event-time-anstelle-der-transaktion-time-in-datomic – Johan

Verwandte Themen