2014年12月31日水曜日

CouchDBをpythonで操作する

さて実際のDB操作のための実装に移ります。例題として、ちょっと理科年表のデータを入れてみます。(地球半径とか高度ごとの気圧です)


ちょっと見にくいですが、Raidus, SeaLevelGravity, StaticPressureの3個のドキュメントを作成しました。これをプログラムで参照、変更してみます。
Futon上で最初にデータベースを作成してて困ったのが以下のStaticPressureです。
「高度:気圧」のペアのリストの構造なので、JSON形式でも扱いやすいしpythonでも辞書型で扱い易いと思ったんですが、Futon上からはどうしても思うように入力できません。結局、valueにはカンマ区切りの数字の羅列(高度1、気圧1、高度2、気圧2、。。。)という形式にしました。(そのうち3次元テーブルもでてくるから、このフォーマットの方が汎用性高いでしょう。javaにもpythonにもsplit()関数があって、valueを文字列で取得、個々の数字を簡単に切り出せますし。)
しかし、どうも辞書形式が登録できないのが気に入りません。頑張って上図のdataのように、「文字列:数字」のペアなら辞書として登録できることがわかりました。(どうもこれはFutonというより、CouchDBの制約のようです。後に実装でpythonから数字ペアの辞書を登録しますが、CouchDB上では最初の数字は文字列と認識されてしまいます)

ということで、pythonから直接、数字ペアを登録してみます。ドキュメント「Radius」にdataというFieldを作成しておいて、以下のコードで実行してみます。


# coding: utf-8
import couchdb

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

doc = db['Radius'] # ドキュメントの取得(コピーを作成するので注意)

dl = { 1:1, 2:2, 3:3} # サンプルデータの辞書

doc['data'] = dl # ドキュメントの一部を変更

db[doc.id] = doc # ドキュメントの更新
#db.commit() # なくてもいい

見た目は数字ペアの辞書が登録できたように見えます。


ところが、以下のプログラムで確認してみると、
# coding: utf-8
import couchdb

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

doc = db['Radius'] # ドキュメントの取得(コピーを作成するので注意)

print doc['data']

実行結果は以下の様になります。
{u'1': 1, u'3': 3, u'2': 2}
全然ダメです、最初の数字が文字列として認識されてしまっています。

余談:
ところでCouchDBは古いリビジョンを残していて、「適当」なところで自動的にガベージコレクションしてくれるそうです。ただ、プログラムを作って、動かしている方としてはHDDの容量も気になるので、意図的に古いのを削除したくなります。python-couchdbでは以下のメソッドで古いリビジョンを削除します。

# coding: utf-8
import couchdb

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

#db.cleanup() # これは古い設計
db.compact() # こっちが今の、古いリビジョンのドキュメントは削除する

説明見てたら同じようなメソッドが2個あったので試してみましたが、やはりcleanup()の方はダメで、そもそもエラーが出てきました。(説明にはそこまで書いてなかった)

0 件のコメント:

コメントを投稿