コンパイラかく語りき

import { Fun } from 'programming'

RethinkDBで「DBが存在して無ければ作る」「テーブルが存在して無ければ作る」

※ Nodeで書いてますが、ReQL自体は言語フリーなので他言語の方にも参考にはなると思います。

初期化時にありがちな、DBとテーブルを有無をチェックしながら作成するという処理。

DB作成

// 無ければDBを作成
r.dbList().contains('messages').do((containsDb) => {
  return r.branch(
    containsDb,
    {created: 0},
    r.dbCreate('messages')
  )
}).run(conn)

テーブル作成

// 無ければTableを作成
r.tableList().contains('messages').do((containsTable) => {
  return r.branch(
    containsTable,
    {created: 0},
    r.tableCreate('messages')
  )
}).run(conn)

リファレンス

dbList, tableList

文字通り、リストを取得します。返り値はArrayです。

dblist - ReQL command tablelist - ReQL command

contains

Sequence内に引数で渡した値がある場合はTrueを返します。あるいは、Boolean判定関数を引数に渡すことも可能です。 ※Sequence = Array, Stream, Tablesのようなリスト型

contains - ReQL command

do

引数に関数を設定すると、その関数を実行します。その際、直前のReQLの結果を引き継ぎ、関数の引数として渡すことができます。

do - ReQL command

branch

第一引数にBooleanを取り、trueなら第二引数の処理を、falseなら第三引数の処理を行います。if-then-else的な処理ができます。 引数はいくらでも設定でき、if-then-elseif-then-elseif-then…とつなぐこともできるようです。

branch - ReQL command

おまけ

ちなみに、上記の処理を、接続から起動までチェーンにした1例がこちら。

const async = require('async')

// 接続
const connectRethinkDB = (cb) => {
  r.connect({
    host: 'localhost',
    port: 28015,
    authKey: '',
    db: 'trialDB'
  }, cb)
}

// 無ければDBを作成
const createDB = (conn, cb) => {
  r.dbList().contains('messages').do((containsDb) => {
    return r.branch(
      containsDb,
      {created: 0},
      r.dbCreate('messages')
    )
  }).run(conn, (err) => {
    cb(err, conn)
  })
}

// 無ければTableを作成
const createTable = (conn, cb) => {
  r.tableList().contains('messages').do((containsTable) => {
    return r.branch(
      containsTable,
      {created: 0},
      r.tableCreate('messages')
    )
  }).run(conn, (err) => {
    cb(err, conn)
  })
}

// 複数処理を連続的に実行
async.waterfall([
  connectRethinkDB,
  createDB,
  createTable
], (err, conn) => {
  if(err) {
    console.log(err)
    process.exit(1)
    return
  }
  startExpress()
})

こちらのコードをガッツリお手本にしました。 https://github.com/rethinkdb/rethinkdb-example-nodejs/blob/master/todo-angular-express/app.js