▼ 2008/02/17(日) CakePHP1.2をSQLite3で動かしてみた。&ダウンロード
dbo_sqlite3_spok とは
CakePHP1.2b用 SQLite3データベースオブジェクトです。CakePHPでは、SQLiteは、バージョン2までしか対応していませんが、PHP5の機能(PDO)を使って対応させてみました。私はSQLite2でなく、SQLite3が好きなので。。。
以前はSQLite2で動いていたサイトをCakePHPでSQLite3を対応させてみました。
本を買う前にこの書評を読め!
PaginatorでPaginateしてみた。
は、CakePHP version 1.2.0.6311 beta, SQLite 3 で動いています。(最近レンタルサーバーが重いことが多いので、ご容赦を。CakePHPやSQLiteが重いのでなくてサーバー自体の問題です。)
サイトがしょぼいのどうのはともかく、一応、まともに動いています。
私はこれまでに、CakePHPがSQLite3に対応しにくい理由と偉そうなことを書いたり、SQLite2より3の方が断然いい理由やSQLiteを使うべき10の理由と5つのデメリットと、SQLiteマンセーの記事を書いたりしてきたけど、やっぱり自分でやってみたくなってやってみた、ということです。
CakePHPはMITライセンスとのことなので、改造、再配布は問題ないと思うのだけれど。。。
注意
PHP5限定です。PHP4では動きません。(そうかこれがSQLite3にCakePHPが正式対応しない理由かもね)
数少ない状況でしかテストしておりません。複雑なクエリのテストはしておりません。
人柱として理解のある方のみお試し下さい。
制限事項 (追記の追記)
「*」については、すべてのフィールド名を展開してSELECT文を発行することで対処しました。
その他、ご自分で独自SQL文を発行している方については不具合がでるかもしれません。
複雑なSQLは、私自身思いつかないので、テストにも限界があるのが実情です。
うまく動かすコツは、取得するフィールド名については、フィールド名だけでなく、必ずモデル名も指定しておけばいいと思います。
つまり
SELECT id,content FROM ....ではなく
SELECT Hoge.id,Hoge.content FROM ....ということです。
del:また、テーブルをジョインするときは、大文字で「JOIN」として
......JOIN hoge_model_name as "HogeModelName"と、CakePHPが自動作成するSQL文に準じた形で書いていただくとうまくいくかと思います。
ポイントは、「JOIN」は大文字、実テーブル名の後のモデル名(エイリアス)は、”(ダブルクオーテーション)で囲む。
バージョン1.0.5bで対応しました。
とにかく
SELECT Hoge.id,Hoge.content FROM ....を守っていれば、かなり大丈夫と思います。
ダウンロード
1 下記zipファイルをダウンロード- 最新バージョン
(1.07にバージョンアップしました。フィールド名に「name」が使われているとエラーがでる現象に対処しました。)
以前のバージョン
SQLite3_spok1.0.6beta.ZIP
(1.0.6にバージョンアップしました。LEFT JOIN などという形のJOIN形式にも対応しました。以前は、取得フィールド* で JOIN句を使うとエラーでした。)
(1.0.5Bにバージョンアップしました。独自sqlで、JOINするときにカンマ区切りでも大丈夫なようにしてみました。また複雑な副問い合わせの場合にも対処しました(つもり)。その他マッピングの不具合を修正。)
SQLite3_spok1.0.5beta.ZIP
(1.0.4bにバージョンアップしました。独自SQLをfunciton query( 'SELECT .......' );と発行した場合に対処しました。
SQLite3_spok1.0.4beta.ZIP
以前のバージョン
(1.03bにバージョンアップしました。取得フィールドが、「*」 の時にテーブル名(モデル名)が、ゼロになってしまっていたのを修正しました。
SQLite3_spok1.0.3beta.ZIP
以前のバージョン
(1.0.2bにバージョンアップしました。一部、insertでエラーが出たのを修正。アソシエーションで同じフィールド名を持っている場合のマッピングの不具合修正。)
SQLite3_spok1.0.2beta.ZIP
2 解凍した2つのファイルを以下にコピー
- dbo_sqlite3_spok.php は、 app/models/datasources/dbo/ にコピー
- dbo_source.php は、app/models/datasources/ にコピー
3 現在のキャッシュをすべて消去 (意外に重要)
4 config/database.phpの中身の例
var $default = array(
'driver' => 'sqlite3_spok',
'connect' => 'PDO',
'host' => '',
'port' => '',
'login' => '',
'password' => '',
'database' => "sqlite:/home/hoge/hogehoge/filename.sqlite3",
'schema' => '',
'prefix' => '',
'encoding' => ''
);
config の注意点
'database' の sqlite:/home/hoge/hogehoge/name.sqlite3と、「sqlite:」を最初につけるのを忘れないでください。PDOの仕様です。ちなみに、「sqlite2:」とすると、SQLite2にも繋げられます。
ウィンドウズ(Windows)の場合は、「sqlite:c:¥hoge¥hogehoge¥filename.sqlite3」のようになります*1。
ファイル名は、なんだって大丈夫。拡張子はsqlite3である必要もないし、拡張子なしでも大丈夫。
'login' => '','password' => '',は、例のように'' か null に設定してください。
留意点
PDOやSQLite3の特性を生かし切ったコードにはなっていません。SQLite2用のコードを流用させていただいたので、あくまでも、とりあえず動くようにしたレベルです。
不具合?
- 不具合などあれば、ご報告しただければ直せるかも知れないし、直せないかも知れません。
- 考えられる不具合
- カラム名の大文字小文字でトラブルがあり得るかも。
- CakePHPでSQLite3を使う(覚書編) のようなやり方なので、ダブルクオーテーションや、ドットが通常ではない形式でフィールド名にまざると誤動作するかもしれません。
- テーブル名を事前マッピングします。as 句 を使った場合に意図しないテーブル名(モデル名)にデータがセットされるかも知れません。(そうならないように工夫したつもりですが)
SQLiteの管理ツール
SQLite管理ツールをご参考に。
*1 : ¥は半角
▼ コメント(0件)
- TB-URL http://www.cpa-lab.com/tech/085/tb/
-
▼
CakePHPでSQLite3を使う(覚書編)
CPA-LABテクニカル CakePHP1.2で、SQLite2を動かすには、CakePHP1.2をSQLite3で動かしてみた。&ダウンロードをご覧下さい。これは自分のための覚書。背景CakePHPでは、データベースからのfetchでarray( 'テーブル名.フィールド名'...