ADODBのsqliteドライバ

2008/04/08 | ADODB

現在簡単なウェブアプリを書く際は、フレームワークとしてguesswork、データベース接続にADODB、テンプレートエンジンはSmarty(もしくはPHP直接記述)という組み合わせを使い、データベースにMySQL(最近はSQLiteも)を使用することがほとんどだ。この組み合わせの中でADODBとSQLiteを使用した際に発生した問題についてメモ。
ADODBでは他のデータベースライブラリと同様に、使用するデータベースを定義することによって必要な処理が分岐されるようになっている。例えばPostgrSQLを使用する場合はpostgres、MySQLを使用する場合はmysqlといった具合だ(文字列の指定方法はデータベースライブラリによって違うので注意が必要)。ADODBでSQLiteを使う場合はドライバに2種類あり、それらは「sqlite」と「sqlitepo」だ。最初はその違いを把握せず(マニュアルなど読んでいない)、「sqlite」を使用していたが、あるとき不具合が出てしまった。

MySQLの場合は例えばselect文を投げてデータを取得した場合は以下のような配列で取得できる。

$row[‘id’]
$row[‘name’]

もちろんSQLiteでも基本的には上記のように返してくれる。しかし例えば複数のテーブルを結合したりしたselect文を発行したりすると、MySQLの場合は上記と同様に返してくれるのだが、SQLiteの場合はテーブル名をくっつけて返してしまうのだ。

$row[‘user.id’]
$row[‘user.name’]

こんな具合だ。「え〜これでは互換性が保てない・・・」と思ってよくよくマニュアルを読んでみた。そしてドライバの違いに気づいた。マニュアルによると、


移植性のあるSQLiteドライバ。sqliteでは他のドライバのように連想モードが機能しないため。つまり、複数テーブルを選択(結合)すると、テーブル名が”sqlite”ドライバの連想キーに含まれます。
“sqlitepo”ドライバでは、テーブル名は返されたカラム名から取り除かれます。この結果が衝突したとき、最初のフィールドが優先されます。

そういうことだったのね。互換性(移植性)を重視するなら「sqlitepo」を使用しなさい、と。しかしこれではどんなデータベースでも汎用的に利用できるライブラリという意味合いがなくなってしまっているような感が無きにしも非ず・・・。気を取り直して「sqlitepo」を使用することにした。


守谷市(まちの情報ポータル) 無料アンケートレンタルjpForm.net