ODBCドライバーについて
Snowflakeへの接続方法としては下記の選択肢があります。
私がPHPでSnowflakeに接続しようとした当時(2023-04-13)は、M1 MacでPDOドライバーを利用するにはバグがり、M1 MacユーザーはODBCドライバーを使ってアクセスする必要がありました。
ただし、現在ではrelease 2.0.0からはARM Macにも対応しているとのことです!(まだ試していませんが)
ですので、通常はPHP PDOドライバーを利用すれば良いと思いますが、本記事は備忘録として残したいと思います。
ODBCドライバーでの接続例
💡 作業環境は以下のとおりです。
- チップ Apple M1
- macOS Ventura 13.3
- PHP8.1
ODBCドライバーのインストール
iODBCとODBCマネージャーのインストール
Snowflakeのドキュメントに従うとiODBCとODBCマネージャーをインストールすることになっています。
iODBCの方はもしかすると不要(使っていなそう)かもしれませんが、一応Snowflakeのドキュメントの手順に従ってインストールします。
また、ODBCマネージャーもインストールします。(こちらもなくても設定可能ですが、あったほうが設定しやすいです。)
ODBCドライバーのインストール
ODBCドライバーをダウンロードする際には、下記過去記事に注意点記載しているので、自身のアーキテクチャに合わせたものをダウンロードしてください。
インストールはダウンロードしたpkgファイルをダイアログどおりに進めていけば良いです。
ODBCドライバーの設定
ODBCマネージャーをインストールした場合、アプリのユーティリティからODBCマネージャーを起動します。
ドライバタブからSnowflakeのドライバがインストールされていることを確認する。
システムDSNタブを開いてドライバの設定を行う。
追加をクリックして、表示されるダイアログで Snowflake のドライバを選択する。
下記の画面になるので各情報を入力する。
- server: Snowflakeのサーバー名
- uid: ユーザーネーム
- pwd: ログインパスワード
- roll: ロール
- warehouse: ウェアハウス
設定が完了したら接続テストを行います。
ターミナルを起動して、下記のコマンドを実行します。(iODBC に付属の iodbctest
コマンドラインユーティリティを使用したテスト)
"/Library/Application Support/iODBC/bin/iodbctest"
SQL>
が表示されれば接続完了です。
PHPが参照しているODBCを確認する
下記コマンドでPHPが参照しているODBCの状況を確認します。
php -i | grep -i odbc
下記の画像例だと、ODBCは有効化されており、unixODBCが使われていることが分かる。(iODBCをインストールしたけれど、unixODBCを使っているようです(?))
unixODBCの情報を下記のコマンドで確認します。
odbcinst -j
下記画像例でいくと、
DRIVERS(ドライバーの情報を設定しているファイル)はhomebrewのフォルダ内にある。
SYSTEM DATA SOURCES(システムDSN設定)もhomebrewの中にある。
→つまり、ODBCマネージャーを使って作成したiniファイルを参照しておらず、homebrew内のiniファイルを参照している事がわかる。
※ODBCマネージャーを使用して作成したiniファイルは /Library/ODBC/odbc.ini
にある。
ODBCマネージャーで作成したodbc.iniとodbcinst.iniファイルを上記で確認したフォルダ内のiniファイルに上書きする
PHPからの接続テスト
下記のコードを参考に接続テストをします。
※odbc_connect()
関数ではuser名とパスワードが引数として必須(?)のようで、iniファイルで設定しているものの、こちらでも入力している。
※下記のコードではtestdbというテスト用のデータベースを作ってある場合のクエリになっています。
<?php
// ODBCデータソース名
$dsn = 'snowflake';
// ユーザー名とパスワード
$user = 'ユーザーネーム';
$password = 'パスワード';
// SnowflakeへのODBC接続を確立する
$conn = odbc_connect($dsn, $user, $password);
if ($conn) {
echo "ODBC connection successful!\n";
} else {
echo "ODBC connection failed!\n";
}
// $tables = odbc_tables($conn);
// while (($row = odbc_fetch_array($tables))) {
// print_r($row);
// break; // further rows omitted for brevity
// }
// ロールやウェアハウス、テーブルなど変更可能
// odbc_exec($conn, "use role accountadmin");
// odbc_exec($conn, "use warehouse compute_wh");
// odbc_exec($conn, "use citibike");
// クエリを実行する testdb用
$query = "SELECT * FROM testschema.test_table";
$result = odbc_exec($conn, $query);
// 結果を出力する
while ($row = odbc_fetch_array($result)) {
echo $row['COL1'] . " " . $row['COL2'] . "\n";
}
// ODBC接続を切断する
odbc_close($conn);
echo "connection closed!";
?>
上記コードによる出力結果
以上で接続完了です!