▼ 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 : ¥は半角
- TB-URL http://www.cpa-lab.com/tech/085/tb/
-
▼
CakePHPでSQLite3を使う(覚書編)
CPA-LABテクニカル CakePHP1.2で、SQLite2を動かすには、CakePHP1.2をSQLite3で動かしてみた。&ダウンロードをご覧下さい。これは自分のための覚書。背景CakePHPでは、データベースからのfetchでarray( 'テーブル名.フィールド名'...
-
▼
[CakePHP] SQLite3を使えるようにする【してやんよ♪】
Rain or Shine現在リリースされているCakePHPはSQLite2にしか対応しておらず、SQLite3はそのままでは使えないので、使えるようにしてみました。なのでちょっとメモ。CakePHP 1.2.3.8166 Stableにで確認。以前からCPA-LABに独自で作ら...
1: 名無しさん 2009年03月30日(月) 深夜3時33分
SQLite3_spok1.0.7beta.ZIPの公開ありがとうございます。
私の環境でいくつか問題があったため報告です。
・Linux(CantOS 5.2)
・PHP 5.2.6
・CakePHP v1.2.2.8120
比較的新しいPHPの環境で、sqlite系の関数が利用出来ない場合があるようです。
DboSqlite3Spok::value のsqlite_escape_string()が利用出来ないため
$data = $this->connection->quote($data);
return $data;
としたところ正常に動作する世になりました。
すぐ後次の行にreturn $dataを置いたのは、メソッドの最後のreturn
だと2重にシングルクオートがついてしまう為です。
また、CakePHPのバージョンの違いのせいか、dbo_source.phpに
calculate()メソッドが無いとおこられたので、cake本体から
コピペしたところ動くようになりました。
2: べり 2009年05月09日(土) 午後5時42分
ソースを使わせてもらってます。ありがとうございます。
セッションの保存先をDBにすると、下記のエラーが出力されてしまい困っています。
HY000: SQL logic error or missing database
解決方法等あれば教えていただけないでしょうか。
よろしくお願いします。