Erlangでsqlite3を使う方法

表題の件を調べたメモ。
ググったらgithub上のerlang-sqlite3がヒットした。ざっとみて良さそうなのでメモっておく。

すでにsqlite3が入っているかどうかはコマンドで

$ sqlite3 --version

てやってバージョン番号が表示されたらおk。
入ってない場合はインストール。apt系なら

$ sudo aptitude install sqlite3

MacMacPorts使ってるなら

$ sudo port install sqlite3

でいいと思われます。

インストール
んでここからが本番。
さっきのGithub上のレポジトリから最新のerlang-sqlite3を引っ張ってきます。

$ git clone https://github.com/alexeyr/erlang-sqlite3.git

そんで落としたディレクトリに移動してテストしてみる。

  $ cd erlang-sqlite3
  $ make test

次々とテストが実行されて

=======================================================
  All 20 tests passed.

のように表示されればおkです。

erlangノードを立ち上げて試してみる(パスにebinを加えて)。

$ erl -pa ebin

データベースのオープン

sqlite3:open(hoge_db).

上記を実行するとカレントディレクトリに"hoge_db.db"というファイルが作られた。
ファイルへのパスを指定したい時は

sqlite3:open(hoge_db, [{file, "/tmp/hoge.db"}]).

のようにすればいいみたい。

テーブルの作成

sqlite3:create_table(hoge_db, tara_table, [{id, integer}, {name, varchar}]).

のようにすると作れるみたいです。

データの挿入
さっきのテーブルにデータを挿入してみます。

sqlite3:write(hoge_db, tara_table, [{id, 3}, {name, "myname"}]).

通常は上記の書き方が良いでしょうが、直接SQLを書く事もできます。

sqlite3:sql_exec(hoge_db, "insert into tara_table values(1, 'shin')").

挿入する値を可変にするにはリストで指定します。
以下のようにsql中の置き換える部分を"?"にしておいて続く引数のリストで指定するようですが、その際に{?の出現順番, 値}で指定するようですね。

sqlite3:sql_exec(hoge_db, "insert into tara_table values(?, ?)", [{1, 2}, {2, "hiroe"}]).

さらに適当な文字で置き換えもできるみたい

sqlite3:sql_exec(hoge_db, "insert into tara_table values(:id, :name)", [{':id', 3}, {':name', "hiroe2"}]).

データの取得
全てのレコードを取得するにはread_allで。

sqlite3:read_all(hoge_db, tara_table).

上で取得した戻りは以下のようなものでした。

[{columns,["id","name"]},
 {rows,[{1,<<"shin">>},
        {1,<<"shin">>},
        {2,<<"hiroe">>},
        {2,<<"hiroe2">>},
        {2,<<"hiroe2">>}]}]

特定のカラムだけ取得したい場合は以下のように欲しいカラム名をリストで指定します。

sqlite3:read_all(hoge_db, tara_table, [name]).

条件指定で取得するには"sqlite3:read/3"を使います。

sqlite3:read(hoge_db, tara_table, {name, "hiroe2"}).

より複雑な条件で取得したい場合は挿入のとき同様、"sqlite3:sql_exec/3"が使えます。

sqlite3:sql_exec(hoge_db, "select * from tara_table where id = :id or name= :name", [{':id', 2}, {':name', "myname"}]).

データベースのクローズ
データベースを閉じるには

sqlite3:close(hoge_db).

とします。

詳しい使い方はGithubレポジトリ上のtest/sqlite3_test.erlを見るとわかります。

自作アプリケーションへの組み込み
あと、実際自分の開発するアプリケーションにどのように組み込むのかですが、正直まだErlangはじめたばっかりでわかってません。
とりあえず、自分のアプリケーションのルートにpluginてディレクトリつくって

 cd plugin
 git clone https://github.com/alexeyr/erlang-sqlite3.git
 cd erlang-sqlite3
 make

した上でアプリケーションのルートに戻って

$ erl -pa ./ebin ./plugin/erlang-sqlite3/ebin

のようにerlang-sqlite3のebinディレクトリにもパスを通したところつかえました。

もう少し調べて標準的にどうしてるのかわかったら追記します。

アプリケーションへの組み込みについて、以前コメントで教えて頂いたVoluntasさんが今回も教えてくださいました。
大変助かります。ホントに感謝。

というわけでやってみます。
実はコメントで書いて頂いてる通り、前回教えて頂いたrebarにその機能がありました。
まずはアプリケーションのルートディレクトリに置いたrebar.configを開き、以下を加えます。

{deps_dir, ["deps"]}.
{deps, [{sqlite3, 
         "1.*",
         {git, "git://github.com/alexeyr/erlang-sqlite3.git", 
          {branch, "master"}}}]}.

一行目は依存関係にあるライブラリを置くディレクトリの名前のようです、ここに書いておけばこの後のコマンド実行で自動的に作られます。
2行目以降は取り込むライブラリの情報を書きます。sqlite3のバージョン1(*はワイルドカード、より細かく指定しても良い)。そしてgitレポジトリの情報。この情報を元にrebarがこの後Pullします。またここではbranchにmasterを指定してます。

編集を終えたらrebarコマンドでpullします。

$ ./rebar get-deps

これで自動的にdepsディレクトリが作られて、そこにsqlite3がcloneされます。
あとは

$ ./rebar compile

すればライブラリも自動的にビルドされます。