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
(d/q '[:find ?token ?arn
     :in $ ?uid
     :where
      [?dt :device_token/user ?uid]
      [?dt :device_token/endpoint_arn ?arn]

などとしたとき、 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つになる。
まぁ基本的にはそれでいいのかな。

参考資料(便利)

このエントリーをはてなブックマークに追加