「CQLを使って、CassandraをSQLライクに操作する。」に続いて、Cassandraをプログラムから操作してみます。
Cassandraの操作は、Apache Thriftという枠組みによっておこないます。
しかし、各言語にはラッパーライブラリが用意されているので、そういったライブラリを利用すると、Thriftを意識しなくても簡単にCassandraの操作ができます。
PHPクライアントライブラリphpcassa
PHPには、いくつかのCassandraのクライアントライブラリがあります。調べてみたところ、よく使われていそうなのは、phpcassaでした。
phpcassa 1.0.a.6 Documentation — phpcassa v1.0.a.6 documentation
これも、ThriftによるCassandraの操作をラップしたライブラリです。
ライブラリのソースコードは、GitHubで、MITライセンスとして公開されています。
thobbs/phpcassa
phpcassaをプロジェクトに導入する。
さっそくプロジェクトに導入してみます。
プロジェクトをGitで管理している場合は、サブモジュールとして導入するのが良いと思います。
mkdir -p libs
git submodule add https://github.com/thobbs/phpcassa.git libs/phpcassa
または、GitHubに公開されているリリースバージョンからzipファイルをダウンロードして、プロジェクトディレクトリに導入することもできます。
Releases · thobbs/phpcassa
続いて導入したファイルを読み込みます。
読み込まなければならないのは、phpcassaのlibディレクトリ内のautoload.phpです。これを追加しておけば、あとの依存は自動で解決されます。
require_once (__DIR__ . '/lib/autoload.php');
use phpcassa\Connection\ConnectionPool;
use phpcassa\ColumnFamily;
use phpcassa\SystemManager;
use phpcassa\Schema\StrategyClass;
phpcassaのサンプルコードにならって、ネームスペースの解決も追加しておきます。
phpcassaで、Cassandraに接続
導入ができたら、実際に接続するコードを記述します。
ConenctionPoolクラスのコンストラクタの引数に、キースペースの名前と、接続先のホストを指定します。今回は、「分散データベースApache CassandraをMac OS Xにインストール」でインストールした、Mac OS XのローカルのCassandraへ接続します。
$connection_pool = new ConnectionPool('first_keyspace', array('127.0.0.1'));
接続したら、ColumnFamilyのオブジェクトも作成します。
$first_table = new ColumnFamily($connection_pool, 'first_table');
ここまで実行したところでエラーが出てしまいました。
$ php main.php
PHP Fatal error: Uncaught exception 'cassandra\NotFoundException' in /Users/kataoka/Desktop/cassandra-php/lib/phpcassa/AbstractColumnFamily.php:200
Stack trace:
#0 /Users/kataoka/Desktop/cassandra-php/main.php(11): phpcassa\AbstractColumnFamily->__construct(Object(phpcassa\Connection\ConnectionPool), 'first_table')
#1 {main}
thrown in /Users/kataoka/Desktop/cassandra-php/lib/phpcassa/AbstractColumnFamily.php on line 200
カラムファミリへの接続ができないというエラーですが、調べてみると、CQLのバージョンとカラムファミリの作り方に原因があるようです。
phpcassa: cassandra\NotFoundException when instantiating ColumnFamily class
ここでは、with compact storage句を追加して、カラムファミリを作り直します。
create table first_table (
name text PRIMARY KEY,
value text
) with compact storage;
これでエラーが出ずに接続ができました。
データを追加する。
続いて、Cassandraにデータを保存してみます。
ColumnFamilyクラスには、insertメソッドが定義されているので、これを利用します。
$first_table->insert('hoge', array('value' => 'fuga'));
$first_table->insert('piyo', array('value' => 'hage'));
ここで第1引数がプライマリキーとなっています。
ここまで実行したところで、CQLシェルでデータベースの状態を確認してみます。
cqlsh:first_keyspace> select * from first_table;
name | value
------+-------
piyo | hage
hoge | fuga
(2 rows)
確かに保存されています!
データを削除する。
今度は挿入したデータを削除してみます。
削除には、removeメソッドを使用します。
$first_table->remove('hoge');
これも同様に第1引数がプライマリキーとなっています。CQLで試した時もプライマリキーの指定でしか削除ができませんでしたが、ここでもプライマリキーの指定以外での削除の方法はなさそうです。
cqlsh:first_keyspace> select * from first_table;
name | value
------+-------
piyo | hage
(1 rows)
hogeキーのデータが削除されました!
データを更新する。
データの更新もしてみます。
$first_table->insert('piyo', array('value' => 'hogera'));
データの更新も挿入と同様にinsertメソッドでおこないます。
CassandraはKVSの一種なので、挿入と更新に区別がありません。だから、更新もinsertメソッドでおこないます。CQLは、insertとupdateの両方が用意されていますが、あれはSQLに合わせて用意されているだけで、実体は同じものであるとのことです。
cqlsh:first_keyspace> select * from first_table;
name | value
------+--------
piyo | hogera
(1 rows)
更新ができました!
データを取得する。
取得が最後になってしまいましたが、最後にさきほど更新したpiyoキーのデータを、phpcassaから取得してみます。
使用するのは、getメソッドです。
$result = $first_table->get('piyo');
引数には、例によって取得対象のプライマリキーを指定します。
返り値のデータを出力すると、保存した値が取得されていることが分かります!
array(1) {
["value"]=>
string(6) "hogera"
}
どうやら結果にプライマリキーは含まれないようです。
まとめ
今回は、phpcassaを使ってプログラムからCassandraを操作してみました。
これで、Cassandraを起動して、PHPベースのWEBアプリケーションから利用する準備が整いました!
(Javaのクライアントライブラリの使い方に続くかもしれません。)
コメント
[…] という話題に踏み込んでいきます。→「phpcassaで、PHPからCassandraを操作する。」 […]
[…] 「phpcassaで、PHPからCassandraを操作する。」に続いて、今度はJavaからCassandraを操作してみます。 […]