2014年11月14日金曜日

CentOSのPHP(pdo-dblib)から、ODBCなしに Azure SQL Database に接続する(前回の続きです)

前回は、私の嫌いなODBCを使わなくてもコマンドラインで SQL Database につながることを確認しました。
SQL Database が use が使えないので、DB名を接続時に指定する必要があることがわかりました。

では、まずphpinfo()で、PDO周りの設定を確認しましょう。
(おそらくパッケージは epel の php-pdoでしょうか)

以下の状態ならOKです。(コマンドで見てます...)
PDO

PDO support => enabled
PDO drivers => dblib, firebird, mysql, odbc, pgsql, sqlite

pdo_dblib

PDO Driver for FreeTDS/Sybase DB-lib => enabled

Flavour => freetds

接続に必要なのは、dblibです。
FreeTDSのライブラリの中にある DB-Library を使っています。

なお、FreeTDSは前回の設定と同様です。
freetds.conf の内容はこんな感じでしたね。
[mymssql]
host = mssql1.database.windows.net
port = 1433
tds version = 8.0
client charset = UTF-8

この場合、PHPのコードはこうなります。
$server = 'mymssql';
$username = 'user@mssql1';
$password = 'password';
$database = 'mydatabase';

$db = new PDO("dblib:host=" . $server . ";dbname=" . $database . ";charset=UTF-8", $username, $password);
foreach ($db->query('SELECT DB_NAME()') as $row) {
  print_r($row);
}


公式ドキュメントでハマるところは、DSNのhostに渡す名前です。
これは freetds.conf に記述してあるサーバー名(ここでは mymssql)だったんですね。
そりゃわからんよ。

mssql関数でも、ある程度まではイケるんですが、接続時にDB名を指定する方法がわからずに断念しました。(masterには繋げます)

Azureの SQL Database は、唯一管理されたRDBMSなので、もっと他のOSや言語から簡単に繋がってほしいものです。

思い切って、OpenTechとかがFreeTDSプロジェクトに参加するとか、どうでしょう?










2014年11月11日火曜日

CentOSからコマンドラインで Azure SQL Database につなぐ

Azureで不便に思うことがある。
SQL Database をさくっとコマンドでなんとかしたい場合だ。
いろいろBingると、もちろんFreeTDS+UnixODBCを使ったサンプルが山ほどある。

しかし、yumでさくっとできないとかイヤじゃん。
ということでやってみた。

1. EPELリポジトリを有効にする
あなたのCentOSは、以下のコマンドでおそらくEPEL拡張パッケージが使えるようになるはず。
# yum install epel-release

くわしくはこちらを参考に。
https://fedoraproject.org/wiki/EPEL

2. FreeTDSをインストールする
以下のコマンドでインストールするだけ。
# yum install freetds

3. freetds.conf の設定
インストールすると、tsqlというコマンドが使える。
まずは設定ファイルの場所を確認する。
# tsql -C

たぶん良い子な皆さんは、/etc の下にあるはずだ。
こいつを環境に合わせて編集する。
# vi /etc/freetds.conf
[mymssql]
host = mssql1.database.windows.net
port = 1433
tds version = 8.0
client charset = UTF-8

この場合、[mymssql]が tsqlコマンド実行時に "-S" で指定する文字列。
接続する前に、もうひとつ。

4. SQL Database 側で接続許可
管理ポータルで、接続するホストのグローバルIPを許可する。
今回、同じリージョンからやってみたけど、なぜか繋がらないのでわざわざ許可。

5. 名前解決ができないので dig で接続したい SQL Database のIPアドレスを確認
なぜ出来なかったのかわからないが、先にIPアドレスを確認して指定したら接続できた。
謎が多すぎてここで挫ける人もいるかもしれない。

6. tsqlコマンドで接続
さて、やっと接続できる。
ユーザーが「user@mssql1」、パスワードが「password」、SQL Database のIPアドレスが「12.34.56.78」、データベース名が「mydatabase」の場合、こうなる。
# tsql -S mymssql -U user@mssql1 -P password -H 12.34.56.78 -p 1433 -D mydatabase

locale is "en_US.UTF-8"

locale charset is "UTF-8"
using default charset "UTF-8"
Default database being set to mydatabase
1> 

こうなったらあとはコマンドで好きなように。
ただひとつ、useコマンドが使えないのでご注意を。

わかったことは、「UnixODBCいらない」ってことか。勉強になった。
たぶんPHPだと、ここに php-mssql 入れたら繋がるんじゃないかな。
ODBC経由しかないと思ってたけど、思い込みは良くない。反省。

なお、PHPでmssql関数を使えば、FreeTDS(dblib)だけでイケるんですが、
SQL Server の場合はOKでも、SQL Databaseの場合はuseが使えなくて詰んでしまう。
(要調査)