CakePHP2でSQLite3を使う方法

CakePHP2 で SQLite3 を使う機会があったので記録として残しておきます。

すごく簡単に使えます。

SQLite3 の導入のメリットは引っ越しが簡単で、データベースファイルの移動だけで新しい環境に移せます。わざわざデータをダンプして移し替える手間が無いし、読み込みがメインなら使い勝手は良いですね。SQL文が MySQL と少し違いがあリますが・・・。

今回は CakePHP2 で SQLite3 を使う事を前提で記述します。

公開ディレクトリは、/home/user/cake/app/webroot/ と仮定して作業しますので、ご自分の環境に合わせて設定してください。
データベース名は、「cake」で作ります。

スポンサーリンク

SQLite3とphp5-sqliteをインストール

SQLite3 のデータベース保存用ディレクトリを作成

気をつける点が一つ、公開ディレクトリに SQLite3 の保存用ディレクトリを作らないようにして下さい。やむを得ない場合は、「.htaccess」などでディレクトリに直接アクセス出来ないように設定してください。ダウンロードされた場合、中身が丸見えです・・・。
ここからは一般ユーザーで作業します。

SQL文を作成・流し込み

SQL文の見本です。
今回は、cake.sql(utf-8)を作り一気に流し込みます。INSERT の前にトランザクションを使ってますが、データ量が少ない場合は不要です。データが大量にある場合はトランザクションを使った方が流し込みが速くなります。

SQLite の日付関数は、そのまま使うと、-9時間(UTC)なので、datetime(‘now’, ‘localtime’)の様に「localtime」を指定する必要があります。

それでは SQLite にデータを流し込みます。cake.sql を先ほど作ったディレクトリにアップしておいてください。

流し込みを行うと、/home/user/sqlite3/cake.sqlite3 が作成されます。これがDBファイルです。私は、拡張子「.sqlite3」を付けていますが、流し込みの時に指定しなければ、「cake」だけでも動きますが、拡張子を付けた方が SQLite3 のファイルだと分りやすいので付けています。

パーミッションの設定

SQLite に書き込みをしない場合は、この作業は不要ですが一応作業しておきます。

レンタルサーバーの場合は、「700」と「600」にして下さい。書き込みでエラーが出る場合は、「707」と「606」などに変更して下さい。
パーミッションを変更しないで書き込みを行うと、「SQLSTATE[HY000]: General error: 14 unable to open database file」のエラーが出ます。

CakePHP2のdatabase.phpを修正

パスを/home/~から指定してあげるのがポイント。これで CakePHP でSQLite3 が使えるようになります。意外と簡単ですね。

SQLite3 で知っておいた方が良い事

SQLite3 にログイン

パスワードなどは無い。

SQLite3 を抜ける

SQLite3 のコマンドは、初めにドット「.」が付きます。

SQLiteの内部テーブル参照

テーブルの情報を見ることが出来ます。

表示方法変更

上記のままだと見にくいので表示方法を変更。

テーブル削除

MySQLと同じです。

データベースの削除

cake.sqlite3 を削除するだけです。

バキューム

PostgreSQL を扱った事がある人なら分ると思いますが、MySQLでは無い作業があります。SQLite では DELETE しても物理的に削除されず、cake.sqlite3 がだんだん肥大化していきます。バキュームを行うと、空き領域の開放をしてDBファイルが小さくなり、デフラグも一緒に行われます。Cronで仕込んでおくと便利です。3.1からauto_vacuumも使えますが、cron でvacuumをした方が良いかも。

SQLite3のバージョンを調べる

database is lockedエラー

SQLite3 は、書き込みが多すぎると「database is locked」が頻発します。SQLite3 では明示的にトランザクションを開始しなくても行われていますが、その際にコミットが出来なく、「database is locked」が発生している様です。「database is locked」が多発する時は、明示的にトランザクションを指定し、コミットのタイミングを調整する事によって解消できるかもしれません。ジャーナルファイルをメモリ上に作る方法で、書き込みを速度をアップする方法もあります。方法はネットで調べてください。キーワード「SQLite3 PRAGMA journal_mode = MEMORY」それでも無理なら、SQLite3 の限界だと思った方が吉。

空き容量の確保

トランザクションなどを行うと、ジャーナルファイル(cake.sqlite3-journal)が作られます。その為、ディスクの容量をある程度は確保しておきましょう。

読んで頂いて有り難うございます!