CakePHP2.0系でSQLite2を使うには
【追記】
CakePHP2.0系は、もともとの仕様としてSQLite3のみをサポートしています。
SQLite2を使おうとするのは、つまり邪道です。
http://book.cakephp.org/2.0/ja/appendices/2-0-migration-guide.html#id30
『Sqliteサポートが素晴らしく向上しました。
cake 1.3との主な違いはSqlite 3.xのみをサポートするということです。』
問題点
CakePHPでおなじみのブログチュートリアルを試していて、MySQLになら接続できるのに、SQLite2には接続できない問題に直面しました。下記のメッセージが表示されてしまいます。
『Error: SQLSTATE[HY000]: General error: 26 file is encrypted or is not a database』
詳しくはフォーラムで質問していますので、そちらをご覧ください。
【参考】"(Cake2.0.3) SQLiteからデータを読み出せない" フォーラム - CakePHP Users in Japan
http://bit.ly/AEXYVj
解決方法
下記のように、緑色文字部分を追加。
【(Cakeフォルダ)/lib/Cake/Model/Datasource/Database/Sqlite.php
(113行目〜)
//$this->_connection = new PDO('sqlite:' . $config['database'], null, null, $flags);
$this->_connection = new PDO('sqlite2:' . $config['database'], null, null, $flags);
なぜそうするのか(理由)
PDOで、SQLite2とSQLite3ではDSN(データソース名:Data Source Name)の記述が異なります。【そもそものPDOのコンストラクタの書き方】
【参考】PHP: PDO::__construct - Manual
$pdo = new PDO('DSN', 'ユーザ名', 'パスワード', 'ドライバオプション');
http://php.net/manual/ja/pdo.construct.php
【SQLiteのDSNの書き方】
バージョン | DSN |
---|---|
SQLite2 | sqlite2:/path/to/pdotest.sq2 |
SQLite3 | sqlite:/path/to/pdotest.sq3 |
http://codezine.jp/article/detail/433?p=2
つまり、CakePHP2.0はSQLite3用の記述になってたわけです。
なので、SQLite2用の記述に変更すれば解決できます。
残った疑問
Windows VistaではSQLite3に正常に接続することができます。しかし、Ubuntuでは失敗します。
普段はUbuntu機をメインに使っているので、『CakePHP2.0では、SQLite2も3も使えない!』と思い込んでいました。
今後は、SQLite2ならばWindowsでもUbuntuでもデータを読み出せるので、ローカルでのテスト用にSQLiteを使っている私としては、これで問題ありません。
Ubuntu(おそらくLinux全般)でSQLite3をどうしても使いたい!という方は…、頑張って解決策を見つけてください(^ ^;)
【追記】
UbuntuでSQLite3が使えないのは、私のPCだけの不具合なのかもしれません。
現在のところ、理由ははっきりしません。