RethinkDB + Go Lang


この記事は atWare Advent Calendar 2015 の18日目の記事です。

皆さん、こんにちは。4回目の登場の矢納です。
今回はプロジェクトで使っている技術紹介です。

何を使っているの?

現在私のプロジェクトはWebサービスを作成中です。メンバーは2、3人で行っています。この人数なのでフロント・バックエンド両方の開発を進めています。フロントエンドはReact.js + ES6、バックエンドはGo言語を使って開発を行っていますDBにはRethinkDBを使っています。

RethinkDBのライブラリ

RethinkDBには多くのAPIが用意されています。それらを使って操作を行います。RethinkDBには管理画面が用意されており、その画面からAPIを呼び出す事ができます。

この管理画面ではJavaScriptでスクリプトを記述します。オフィシャルで出ているドライバーは4つ。JavaScript, Ruby, Python, Javaです(参照)。ですが、今回はGo言語を使っての開発です。ではどうするか。コミュニティが作成しているgorethinkを使います。

どうやって使うの?

これは至って簡単。
まず最初にインストール。

$ go get -u github.com/dancannon/gorethink

DBとの接続。

import rdb "github.com/dancannon/gorethink"

session, err := rdb.Connect(rdb.ConnectOpts{
    Address: "192.168.50.50",
    Database: "test",
    AuthKey: "J98p2JgcdAXd2V2d",
})

などと、基本的なやり方はGithubに書いてありますので、そちらを参照して下さい。

これで終わるのも寂しいので個人的に少し悩んだQueryをご紹介。
私はよく管理画面でJavaScriptでQueryを作成してから、Go言語になおしていきます。

r.db('test').table('user').
  filter(function(user) { return user('role').ne(90); }).
  filter(function(user) { retrun user('isDeleted').ne(true); })('email');

これはUserテーブルからroleが90以外かつisDeletedにフラグがtrueでないユーザのemailの情報を取得するといううクリプトです。これをGo言語で書くと

resp, err := rdb.Table('user').
Filter(rdb.Row.Field("role").Ne(90)).
Filter(rdb.Row.Field("isDeleted").Ne(true)).
Field("email").
Run(database.Session())

となります。

さいごに

Go言語もRethinkDBもかなり早いです。RethinkDBはリアルタイム性をかなり重視しています。またGo言語もシンプルになるように考えられている言語なのでとても良い言語です(個人の感想です)。