ひとりでやるRiak Advent Calendar 2012 day2 - Pythonクライアント

昨日頑張ってしまったので軽めで。RiakはHTTPのインターフェースがある。HTTPのインターフェースがあったからといって結局はそれを叩くライブラリを各言語で作ることになるのだけど。今日はPythonクライアントを紹介する。

f:id:kuenishi:20121205062445j:plain

参考

インストール

ちょう簡単。protocが必要だった気がする。virtualenv環境だとやりやすいかと。3.2だとやっぱりダメ。MacOSXについてる2.7だと普通にはいる。

$ virtualenv r
$ source r/bin/activate
(r)$ pip install riak

3.3とPyPyは試せてないけど、どうなんだろう。人柱求む。

ちょっと動かしてみる

まあ普通に動くと思うけど、いろいろ

http

Riakは公式ドキュメントでちょっとだけ素材を配布しているので、予め riak-transparent-larger.png を落としておこう。

>>> c = riak.RiakClient()
>>> b = c.bucket('image')
>>> o = b.new('riak-transparent-larger.png', content_type='image/png') 
>>> pngdata = open('path/to/riak-transparent-larger.png', 'rb').read()
>>> o.set_data(pngdata)
<riak.riak_object.RiakObject object at 0x103e97b50>
>>> o._encode_data = False
>>> o.store()
<riak.riak_object.RiakObject object at 0x103e97b50>
>>> 

これで登録。ブラウザで是非 http://127.0.0.1:8098/buckets/image/keys/riak-transparent-larger.png を叩いてみるといい。リバースプロキシでGETとHEAD以外を弾くようにしておけば、小さなファイルを沢山おいてキャッシュやスケーラブルなファイル倉庫にすることもできる。
ちなみにbucketに登録されているキーの一覧は ?keys=true をつければ見れる が、全サーバーにリクエストが飛んで効率が悪いので本番環境で使ってはいけない。

https

ざんねーん、Pythonクライアントにはhttpsモジュールがない模様。

protobuf

ふつうにやると

>>> c = riak.RiakClient(port=8087, transport_class=riak.RiakPbcTransport)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/kuenishi/virtualenv/lib/python2.7/site-packages/riak/client.py", line 81, in __init__
    **transport_options)
  File "/Users/kuenishi/virtualenv/lib/python2.7/site-packages/riak/transports/pbc.py", line 168, in __init__
    raise RiakError("this transport is not available (no protobuf)"

などと怒られる。インストールには普通に成功しているのにどうしてだろう…というところで誰かPull Request送ってくれてもいいと思うよ!

Pythonクライアントだと、他にもLinksという機能で、関連するデータを引っ張ってくるとかできるのでやってみてね!今日はここまで。Secondary IndexとかMetadataとかそういう若干変わった機能を紹介したいなと思うのでお楽しみに。