2016-10-05 6 views
1

エンティティを取り消したいと同時に、db/txInstant属性を指定したいのですが、これを動作させることができません。エンティティを撤回するとこのようになります(これは動作します):私もdb/txInstant属性を供給するためにさまざまな方法を試してみたDatomicに特定のdb/txInstantを設定してエンティティをリトラクトしますか?

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

、例えば:

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

が、これはで失敗します。

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

Datomicでエンティティをリトラクトするときに、db/txInstant属性を指定する方法は簡単です。

+0

このユースケースは何ですか? ':person/email'によって取り消したいエンティティを見つけることができれば、':db/txInstant'も指定する必要はありません。 –

+0

私がこれをやりたい理由は、後で属性が格納されたときに問い合わせることができるようにするためです。 「いつ」は、Datomicを実行しているサーバーのシステム時間ではなく、むしろアプリケーションによって決定された時間です。したがって、私はこれをtxinstantの時刻として指定したいと考えています。 – Johan

+0

残念ながら、それはDatomicが動作する方法ではありません。 txInstantは、トランザクションが発生するたびにコンピュータクロックから読み取られた現在のUTC時間です。 –

答えて

2

これは私の作品:

(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私が理解しているように、変更を指定したトランザクションは、取り消しまたは追加が行われた時点です。どここれを行うことで成功するためにだから場合は、基本的にtransactiorに言っている:

に他のすべての時間のセマンティクスを破る「ねえトランザ今そして今、それがいつか他の起こったトランザクションが作成してください」

DB。だから私たちは一般にネームスペースキーワードをdatomicに使用しています。

:db/txInstantを設定する代わりに、:my.company.db/txInstantを設定します。このようにして、トランザクションによって決定されたトランザクションの時間とシステムの残りの部分の両方が、トランザクションがトランザクションをいつ作成したかを判断できるようになり、イベントストリームのようなものが維持されます。

+0

を参照してください、問題は、I my.company.db/txInstantを見て、(履歴)データベースを取得する必要があります。 db/txInstantでDBを取得できることだけを認識しています。私は満足のいく答えが得られていないためにこれについて別個の質問があります:http:// stackoverflow。com/questions/39287619/use-event-time-of-transaction-time-in-datomic – Johan

0

トランザクションにメタデータを添付する必要がある場合(txが発生した理由など)、そうすることができます。あなたはDatomicのウェブサイト上で良い情報を細かくすることができます

http://docs.datomic.com/transactions.html

http://blog.datomic.com/2015/12/reified-transactions.html

と2015年11月Datomic会議(ClojureのCONJへのプレリュード)からティム・エワルドすることにより、この正確なトピックに関する詳細なビデオ:

http://www.datomic.com/videos.html

関連する問題