PHPでCosmos DB(Javaでも可)

Cosmos DBのSQL(Core) APIのSDKとしては.NETやJavaはあるんだけどもPHPは無い。REST APIなんでPHPでcurlでも何でも使えば実装出来なくもないし、実際過去にそれでちょろっと書いたことがあるんだけども色々辛くなるのは目に見えている。公式SDKを作って欲しいんだが他のプログラミング言語に比べるとニーズが少ないらしく、あまり期待できない。

で、だいぶ前から存在しているのは知っていたCData社のCosmos DB ODBC Driverを試してみることにした。有償ではあるものの、JavaやPHPでCosmosを利用出来る、しかもANSI SQL-92をサポートするしUnicodeもOKなら、まあ日本企業のみならずアジア各国の企業でも使えるだろ、と。

Cosmos DBを作る

Azureポータルから普通に作る。上述の通り、SQL(Core) APIで作れば特に問題はなし。

RHEL8のVMを作ってパッケージをインストール

接続テスト用にRHEL 8のVMをCosmosを作成したリソースグループに作成して、SSHでログインしておく。

ODBC DriverダウンロードページからCosmos DB ODBC Driver for UNIXを選んで、評価版の64bit版のRPMをダウンロードする。debian / Ubuntu用の.debも提供されてる。で、インストール。

# rpm -ivh CosmosDBODBCDriverforUnix.rpm 
warning: CosmosDBODBCDriverforUnix.rpm: Header V4 RSA/SHA1 Signature, key ID ddd3339e: NOKEY
Verifying...                          ################################# [100%]
Preparing...                          ################################# [100%]
Updating / installing...
   1:cdata-odbc-driver-for-cosmosdb-21################################# [100%]

Error:
Cannot find the 64bit iODBC or unixODBC Driver Manager installed on this machine.

Error:
Cannot find the 64bit iODBC or unixODBC Driver Manager installed on this machine.

Error:
Cannot find the 64bit iODBC or unixODBC Driver Manager installed on this machine.

重要なことなので3回もunixODBCドライバが無い、って怒られるw

まあまあ、慌てなさんな今入れるから。

# dnf -y install php unixODBC php-odbc

ODBCドライバ設定

/etc/odbcinst.iniに以下を追加。

[CData ODBC Driver for CosmosDB]
Driver=/opt/cdata/cdata-odbc-driver-for-cosmosdb/lib/libcosmosdbodbc.x64.so
Description=CData ODBC Driver for Cosmos DB

/etc/odbc.iniを以下の内容で作成する。AccountEndpointAccountKeyは作成したCosmosのパラメータをコピペする。もう存在しないCosmosなので大丈夫w

[CData CosmosDB Source]
Driver=/opt/cdata/cdata-odbc-driver-for-cosmosdb/lib/libcosmosdbodbc.x64.so
AccountEndpoint=https://riocosmosphp.documents.azure.com:443/
AccountKey=pC4696QWnCbHhlk1eyBIs4LeM8Po2sq2glHTHQ39SHLVdkLuGE4hK30TjUvXAaVd45ECHGNLqaXQtnQQn4Gk9w==

Cosmosにコンテナを作成する

Azureポータルに戻ってCosmosのデータエクスプローラーでコンテナを作成する。適当で構わない。

PHPで見てみる

こんなtest.phpを書く。

<?php
$cnx = odbc_connect("CData CosmosDB Source", "", "");
$stmt = odbc_tables($cnx);
while ($row = odbc_fetch_array($stmt)) {
    echo "Catalog: ", $row["TABLE_CAT"], "\n";
    echo "Schema: ", $row["TABLE_SCHEM"], "\n";
    echo "Table: ", $row["TABLE_NAME"], "\n";
    echo "Type: ", $row["TABLE_TYPE"], "\n";
}
?>

実行。

$ php test.php 
Catalog: CData
Schema: test
Table: id
Type: TABLE

なるほどね?

まとめ

普通に使えるじゃん。マニュアルにSELECT / INSERTなどの例も載ってるので、既存のPHPコードを修正するもよし、新たに書くのもよし、かと。