AttsuBlog

ATTSU INC. Official Blog
arango1
0 comments

ArangoDBとClojure その1

タグ:,

こんにちは、初めまして。
アッツでエンジニアをやっています萬屋です。社内ツールの作成や自社サービスの開発などを主に行っています。

今回ブログでは主に技術系のネタを任されることとなりました。何かお役に立てるような記事をかけるように頑張ります!

初回なので技術的な自己紹介を。
名前の如し開発に関することならほぼすべてを行っています。まぁただの便利屋ですね(^_^;)

使用言語はPython/Clojure/Scala/Swift/Objective-C/PHP/HTML5/CSS3/Javascript(CoffeeScript)など結構色々使ってきました。
最近はClojureがマイブームですね。
サーバもCentOS/UbuntuServer/FreeBSDなどをメインに、nginx/MariaDB/MySQL/Redisなど、いろいろ触ってきました。
はたまたネットワーク構築やキッティングなどもやります。

こうしてみると本当に萬屋ですね……広く浅くにならないよう日々勉強です(`・ω・´)

初回はマイブームであるClojureとArangoDBのお話をしたいと思います。

ArangoDBって初めて聞いた方もいるかもしれませんが、ドキュメント指向のNoSQLです。MongoDBに近い感じです。
公式サイトはこちら

特徴としては

 ・AQLという独自のSQLに似たクエリ言語
 ・ドキュメント、グラフ、キーバリューの柔軟なデータモデル
 ・高機能な管理画面
 ・トランザクションがある

などがあります。

このArangoDBをClojureから操作してみたいと思います。

まずはArangoDBをインストールしてみましょう。環境はMac10.10です。
Homebrewはインストールしておいてくださいね。


$ brew install arangodb

次に起動させてみます。


$ cd /usr/local/sbin
$ ls -lh
total 16
lrwxr-xr-x  1 user  admin    41B  4 15 09:43 arango-dfdb -> ../Cellar/arangodb/2.5.2/sbin/arango-dfdb
lrwxr-xr-x  1 user  admin    37B  4 15 09:43 arangod -> ../Cellar/arangodb/2.5.2/sbin/arangod
$ ./arangod &

こちらで起動が完了です。試しにブラウザでhttp://127.0.0.1:8529/を開いてみてください。下のような管理画面が出るはずです。

arango2

これでArangoDBの準備は完了です。簡単ですね(・∀・)

次にClojureの準備です。Leiningenをインストールします。Leiningenの詳しい説明は省きますがClojure開発において欠かせないものです(雑)
こちらもHomebrewを使います。JDKはインストールしておいてくださいね。


$ brew info leiningen
# 対話モードを起動します。初回は時間がかかります。
$ lein repl
user=> (+ 3 2)
5
user=> exit
Bye for now!

これでClojureの準備も完了です。

ではサンプルのプロジェクトを作ってみましょう。


# lein new 'template-name' 'ApplicationName'でプロジェクトが作れます。
$ lein new app arango-test
Generating a project called arango-test based on the 'app' template.
# プロジェクトができていることの確認
$ ls -lh
drwxr-xr-x  11 user  staff   374B  4 15 13:21 arango-test
$ cd arango-test/
# 動かしてみます。
$ lein run
Hello, World!

はい、これでClojureの導入まで一気に説明出来ました(笑)

お次はClojureからArangoDBを操作するためのライブラリを入れます。
TravesedoClarangoなどがあります。
どちらも大きな差は無いです、GitHubのREADMEを読んで直感で好きな方でいいと思いますよ(笑)
ただClarangoにはTransaction用のメソッドがないかもしれません。ソースから見つけられなかっただけなのかもしれませんが。

今回はTravesedoを使用したいと思います。
Clojureのプロジェクトにあるproject.cljに必要なライブラリを書いて上げることでインストールできます。


(defproject arango-test "0.1.0-SNAPSHOT"
  :description "FIXME: write description"
  :url "http://example.com/FIXME"
  :license {:name "Eclipse Public License"
            :url "http://www.eclipse.org/legal/epl-v10.html"}
  :dependencies [[org.clojure/clojure "1.6.0"]
                 [deusdatsolutions/travesedo "0.1.3"]]
  :main ^:skip-aot arango-test.core
  :target-path "target/%s"
  :profiles {:uberjar {:aot :all}})

:dependencies[deusdatsolutions/travesedo "0.1.3"]を追加してください。
バージョンはClojarsで確認しましょう。
記述が終わったらインストールします。


$ lein deps
Retrieving deusdatsolutions/travesedo/0.1.3/travesedo-0.1.3.pom from clojars
Retrieving commons-codec/commons-codec/1.9/commons-codec-1.9.jar from central
Retrieving deusdatsolutions/travesedo/0.1.3/travesedo-0.1.3.jar from clojars

これで準備完了ε-(´∀`*)

さて実際に簡単な操作をしてみましょう。
プロジェクトのsrc/arango_test/core.cljを編集します。


(ns arango-test.core
  (:gen-class)
  (:require [travesedo.collection :as col]
            [travesedo.database :as db]
            [travesedo.document :as doc]
            [travesedo.query :as q]))

;; 作成するデータベース名
(def db-name "clojure_test")

;; データベースの作成
(defn create-database
  []
  (db/create {:conn {:type :simple
                     :url "http://127.0.0.1:8529/"}
              :payload {:name db-name
                        :users [{:username "user"
                                 :password "password"}]
                        }}))

;; コレクションの作成
(defn create-collection
  [collection-name]
  (col/create {:conn {:type :simple
                      :url "http://127.0.0.1:8529/"
                      :uname "user"
                      :password "password"}
               :db db-name
               :payload {:name collection-name}}))

;; 値の登録
(defn create-document
  [collection-name value]
  (doc/create {:conn {:type :simple
                      :url "http://127.0.0.1:8529/"
                      :uname "user"
                      :password "password"}
               :db db-name
               :in-collection collection-name
               :payload value}))

;; 値の取得
(defn get-document
  [collection-name value]
  (q/by-example {:conn {:type :simple
                        :url "http://127.0.0.1:8529/"
                        :uname "user"
                        :password "password"}
                 :db db-name
                 :payload {:collection collection-name
                           :example value}}))

(defn -main
  [& args]
  ; DB作成
  (create-database)
  ; コレクション作成
  (create-collection "test_collection")
  ; データ登録
  (create-document "test_collection" {:name "アッツ" :member "宮川"})
  (create-document "test_collection" {:name "アッツ" :member "萬屋"})
  ; データの取得
  (println (get-document "test_collection" {:member "宮川"})))

こちらを実行してみましょう。


$ lein run
{:has-more false, :code 201, :error false, :count 1, :result [{:_id test_collection/65504417493, :_key 65504417493, :_rev 65504417493, :member 宮川, :name アッツ}]}

こんな感じの結果が出力されたでしょうか?
一気にDBの作成、コレクションの作成、ドキュメントの追加、ドキュメントの取得をやってみました。

取得された結果が非常にわかりやすい形ですね。エラーハンドリングも結果の:errorから判定できますし。

ちなみにコレクションの_keyをAutoincrementにする場合などのオプションを渡し方ですが、ソース上の説明書きとは違っていたので注意です。


(col/create {:conn {:type :simple
                      :url "http://127.0.0.1:8529/"
                      :uname "user"
                      :password "password"}
               :db db-name
               :payload {:name collection-name
                         :keyOptions {:type :autoincrement}}})

ソースのコメントでは:keyOptions:key-optionsになっていました^^; もう直っているかもしれませんが。

取得の時に使用したby-exampleですが検索条件が単純なものであればこちらで取得できます。
コレクションを結合したりなど複雑なものはAQLで記述します。

とまぁ、とりあえずはここまでにしておきます。初回からいきなり長くなっちゃいましたね(^^ゞ
一応連載ものにするつもりではあります。なので続きます!

これからもよろしくお願い致しますm(_ _)m


Leave A Comment