※ 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のようなリスト型
do
引数に関数を設定すると、その関数を実行します。その際、直前のReQLの結果を引き継ぎ、関数の引数として渡すことができます。
branch
第一引数にBooleanを取り、trueなら第二引数の処理を、falseなら第三引数の処理を行います。if-then-else的な処理ができます。 引数はいくらでも設定でき、if-then-elseif-then-elseif-then…とつなぐこともできるようです。
おまけ
ちなみに、上記の処理を、接続から起動までチェーンにした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