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
を以下の内容で作成する。AccountEndpoint
とAccountKey
は作成した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コードを修正するもよし、新たに書くのもよし、かと。