Datomic まとめ
TOC
datomic まとめ(追記していく)
datomic 自体の説明
省略。
いつか書くかも。
他に良い記事がたくさんあるので。
datomic 本当のところ(使いながら追記していく)
created_at, updated_at は持つ必要がない
rails で mysql とかつかって作るときだと当たり前のように created_at とか updated_at を持っているけど、
datomic を使う場合は必要ない。
stack over flow に、持ってた方が良い?などの質問に対して、
おれは created_at 入れているみたいな意見があったけど、別にいらないと思う。
; -------- 一応コピペしとく
(def db-url (ref ""))
(dosync
(ref-set db-url "datomic:free://localhost:4334/hoge"))
(defn setup-db [db-url]
(d/create-database db-url)
(d/transact
(d/connect db-url)
(concat
(ds/generate-parts d/tempid (dbparts))
(ds/generate-schema d/tempid (dbschema)))))
(defn setup-testdb []
(dosync
(ref-set db-url (str "datomic:mem:" (d/squuid))))
(setup-db @db-url)
)
(defn connect-db []
(d/connect @db-url)
)
; -------- ここが本質
(defn history [eid]
(d/q
'[:find ?e ?a ?v ?tx ?added
:in $ ?e
:where
[?e ?a ?v ?tx ?added]]
(d/history (d/db (connect-db)))
eid
)
)
これで帰ってくる値は [entity_id, attribute_id, value, transaction_id, added?]
で、これらが引けるということは created_at, updated_at をあえて持たなくて良い。
#<HashSet [
[17592186045436 74 this is new emotion. 13194139534331 true],
[17592186045436 73 0 13194139534331 true],
[17592186045436 72 17592186045423 13194139534331 true],
[17592186045436 71 17592186045421 13194139534331 true],
[17592186045436 75 17592186045432 13194139534331 true],
[17592186045436 70 #inst “2014-12-12T00:11:51.228-00:00” 13194139534331 true],
[17592186045436 71 17592186045422 13194139534333 true],
[17592186045436 71 17592186045421 13194139534333 false],
[17592186045436 74 hogera! 13194139534333 true],
[17592186045436 74 this is new emotion. 13194139534333 false]
]>
サンプルをはるとこんな感じで帰ってきている。(手動で sort 済み)
これは 13194139534331 と 13194139534333 のトランザクションでインサートされたこと、
71, 74 の属性が 変更されたことなどが読み取れる。
where での絞込みでは、nil のものは消えてしまう(datomic というより datalog)
1 2 3 4 5 |
|
などとしたとき、 device_token のレコードに、 arn をもともと空文字列か何かを入れておかないと、
filter されてしまう。endpoint_arn がないときに、それを作って格納みたいなコードを書こうとしたとき
ちょっと困った。
個人的に datomic を立てている設定
https://github.com/pointslope/docker-datomic-example.git
を使って、 fig で up している。
datomic console 付きで立つ。
datomic console から接続するときに HornetQException errorType=SECURITY_EXCEPTION message=HQ119031: Unable to validate user: vzk3d3j04aRQgPmXi6zwfYPxAGOeaWZ1vEdir5GdwtE=
unable to validate user が出た。
これは、 transactor に対して 3つ以上の接続をした時に出る模様。
いったん接続している peer を落としてみたら、無事に接続できた。
そういう意味では、datomic console を使って本番DB をみたいなら、必然的に 待ち受けている peer は 1つになる。
まぁ基本的にはそれでいいのかな。
参考資料(便利)
- http://sunday-programming.hatenablog.com/category/datomic
– めっちゃ参考にさせていただいております。 - http://www.learndatalogtoday.org/
– datomic の query language である datalog のチュートリアル。datomic をやる前にこれを触っておくのオススメ。 - https://github.com/Datomic/day-of-datomic
- https://github.com/Yuppiechef/datomic-schema
– datomic のスキーマを書くのマジしんどいけどこれがあればいい感じでつくってくれて嬉しいやつ。