ようこそゲストさん

CPA-LABテクニカル

2008/02/17(日) CakePHP1.2をSQLite3で動かしてみた。&ダウンロード

はてブ情報 はてブに登録 はてブ数 sqlitespok

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が正式対応しない理由かもね)
数少ない状況でしかテストしておりません。複雑なクエリのテストはしておりません。
人柱として理解のある方のみお試し下さい。

制限事項  (追記の追記)

fields = array( '*' )
を指定すると、得られるモデル名がすべて「0」になるようです。
直接 * を指定されると、確かにテーブル名とフィールド名の事前マッピングが不可能になるので、今回のやり方の限界となります。

「*」については、すべてのフィールド名を展開してSELECT文を発行することで対処しました。


その他、ご自分で独自SQL文を発行している方については不具合がでるかもしれません。
複雑なSQLは、私自身思いつかないので、テストにも限界があるのが実情です。
うまく動かすコツは、取得するフィールド名については、フィールド名だけでなく、必ずモデル名も指定しておけばいいと思います。

つまり
SELECT  id,content FROM ....
ではなく
SELECT  Hoge.id,Hoge.content FROM ....
ということです。


del:また、テーブルをジョインするときは、大文字で「JOIN」として
......JOIN  hoge_model_name as "HogeModelName"
と、CakePHPが自動作成するSQL文に準じた形で書いていただくとうまくいくかと思います。
ポイントは、「JOIN」は大文字、実テーブル名の後のモデル名(エイリアス)は、”(ダブルクオーテーション)で囲む。


JOIN でなく ,カンマ区切りで結合&「*」とすると、たぶんマッピングがうまく動かないので、取得したデータのモデル名はゼロになるかと思います。
バージョン1.0.5bで対応しました。


とにかく
SELECT  Hoge.id,Hoge.content FROM ....
を守っていれば、かなり大丈夫と思います。

ダウンロード

1 下記zipファイルをダウンロード
  • 最新バージョン
SQLite3_spok1.0.7beta.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 : ¥は半角

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

解決方法等あれば教えていただけないでしょうか。
よろしくお願いします。


名前:  非公開コメント   

  • TB-URL  http://www.cpa-lab.com/tech/085/tb/
  • CakePHPでSQLite3を使う(覚書編) CPA-LABテクニカル spok
    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に独自で作ら...