2014年12月30日火曜日

CouchDBを設定し、pythonで操作してみる

NoSQLのデータベースで、高速性よりもフォーマットを自由に扱いたい場合、CouchDBの評判が高いようです。ちょっと試しに自PC上に(Ubuntu14.04)CouchDBを設定し、ついでにデータ操作をどうやるかを試すために、pythonでのサンプルを作ってみます。(オリジナルでJavaScriptのAPIは持っているそうです)

まずCouchDBのHP(launchpad.net)にいってインストール方法を調べます。Ubuntu14.04の場合は以下のようにするらしい。

$ sudo apt-get install software-properties-common

(aptのリポジトリの状態を確認、更新するらしい。
自分の場合あ既にこのリポジトリが入っていたらしく、最新の状態ですと言われた)

$ sudo add-apt-repository ppa:couchdb/stable

既に(古いバージョンが)インストールされているとまずいので、一度削除します。

$ sudo apt-get remove couchdb couchdb-bin couchdb-common

(自分は3個とも入ってない言われました)

いよいよインストールします。

$ sudo apt-get install -V couchdb
$ sudo stop couchdb
$ sudo start couchdb

ブラウザでhttp://127.0.0.1:5984/にアクセスします。
動いてるようですが、文字列しか表示されません。
couchdbのユーザー設定ないから?
(でも/etc/passwdで確認するとcouchdbのアカウントは登録されていました)
HPのドキュメントを見たら、現状はこれでいいようです。

http://127.0.0.1:5984/_utils

でFutonが動きます。大丈夫なようです。(データベースをWebベースで参照、変更、作成ができます)



PCを再起動しても自動的にデーモンは起動しています、Futonが動きました。

pythonでcoudbを使いたいので、/etc/couchdb/local.iniに以下を追加して再起動しろとのこと。

[query_servers]
python=/usr/bin/couchpy

念の為に/usr/bin以下を知らべてみたら、couchjs(おそらくJavaScript用のモジュール)はあるが、couchpyは存在していません。(注:この設定は必要なかったかも、なくてもcouchpyさえインストールすれば動きました。でも本当は必要な筈...)しばらくぐぐった結果、以下のパッケージをインストールしたらよかった。

$ sudo apt-get install python-couchdb

しかしcouchdbの再起動方法がわからない。(/etc/init.d以下にcoudbというスクリプトがあるという情報があったが、ubutu14.04だとそんなのない!どうやって最初に起動してるんだ?→後述)
PS:ちなみにこのpython-couchdb、昔はgoogle-Codeで開発されていたんですが、githubに移っていました。googleでも特に制約はないと思うけど、流行りですかね。
というか、再起動は必要なかった。(うまくいかないようなら、インストール直後にやったみたいにコマンドで直接、停止、起動をすればいいでしょう。)

試しにpythonでプログラムを書いてみました。試験用に用意したのは以下の様なデータです。
ぱっと見わかりにくいでしょうが、Fieldにわざと"name"と”名前”と英語、日本語の両方を使っています。


# coding: utf-8
import couchdb

db = couchdb.Server('http://localhost:5984')
sampledb = db['sample_db']

for id in sampledb:
 dbitem = sampledb[id]
 name = dbitem[u'名前']
 print name

日本語のフィールド名でも動きました。(まあそれでも、英語にしといた方が無難だろうね)

ところでCouchDBはデフォルトではPCの外部からのアクセスは禁止してあります。(データの操作にhttp使うくせに、こういうとこはしっかりしてます)
これを許可しないと使いずらいので、以下の場所を編集します。(コメントにデフォルトでなっているのをはずして、全部のIPアドレスを許可する、といったところでしょうか)

/etc/couchdb/local.ini
;bind 127.0.0.1
        ↓
bind 0.0.0.0

特に起動用スクリプトが見当たらないんですが、勝手に再起動してくれるようです。(他のディストリビューションだと起動用スクリプトができるものもあるらしいですが、今度はcouchdbのアカウントを自分で作ってあげないといけないとか)
あとFuton上でもConfigurationというToolがありそこからもできそうですが、、、ちょっとよくわかりません。うっかいこの項目を削除という操作をしてしまったらしく、いきなりWeb上から何もできなってしまって(まあ意味から考えて通信ができなくなりますわな)、あわてて手動で設定ファイルを編集しなおしました。

ところでCouchDBを通常のDBとして使おうと思ったんですが、どうもサンプルを探すとCouchDBの特徴であるMap/Reduceにより全文中の特定のFieldを探してくる、という例ばかりひっかかります。(考えてみたら、フォーマット自由のドキュメント型DBなんだから、そういう使い方が本道なんでしょうね)
でも自分はとりあえず普通に(ユニークな)idで検索するのをやりたいんです。

とりあえず、以下のプログラムでまずDBを作成します。
# coding: utf-8
import couchdb

server = couchdb.Server('http://localhost:5984')
db = server.create('python-tests')

db['johndoe'] = dict(type='Person', name='John Doe', sex='male')
db['maryjane'] = {'type':'Person', 'name':'Mary Jane', 'sex':'female'}  # あえてjson形式で指定してみる

db.commit()

# 特にcloseとかsaveは必要ない?
# 不安なら時にcommitするか
# 他のPCからすぐに編集した結果を参照したいアプリでは、あったほうがいい

次に以下のプログラムでidを直接指定します。

# coding: utf-8
import couchdb

server = couchdb.Server('http://localhost:5984')
db = server['python-tests']

print db['maryjane']

これで以下の出力がでてきます。
<Document u'maryjane'@u'1-6d8ea1b66198a41c398662aa3ae07514' {u'type': u'Person', u'name': u'Mary Jane', u'sex': u'female'}>

うまくいきました。(couchdb-pythonにAPIとかのマニュアルが見当たらないので、試行錯誤です)

せっかくなので、Map機能を使い検索してみます。FutonでTemplate Viewにして、

以下の関数をMap関数(左側の欄)として定義します。

function(doc) {
  emit(doc.sex, doc);
}

デフォルトは、emit(null, doc);でどうも全文対象という意味らしいんですが、sexというFieldにマークをします。
これをapplication/sample_viewという名前で保存します。(このスクリプト自体がDB内に保存されるのに注意。Futonで参照できます。)

これを使ったサンプルを以下に示します。
# coding: utf-8
import couchdb

server = couchdb.Server('http://localhost:5984')
db = server['python-tests']

#print db['maryjane']

result = db.view("application/sample_view", key="female")

for r in result:
 print 'id',r['id']
 print 'key',r['key']
 print 'name', r['value']['name']

keyの与え方はともかく、検索された後の他のタグを知る方法がちょっとクセがあります。
以下の様に出力されます。

id maryjane
key female
name Mary Jane

とりあえず最低限、必要なことはわかりました。

0 件のコメント:

コメントを投稿