最近LaravelでSQLiteを使って気づいたことをまとめておきます。
Laravelでは、SQLiteはデフォルトで利用できて便利ながら、MySQLと挙動が異なることがありました。そこで注意点をまとめました。
なおSQLite管理ツールとして、DB Browser for SQLを使っています。本記事でもこちらのスクショを使用します。
after句は無効になる
カラムの位置を指定できるafter句は、SQLiteでは無効になってしまいました。
test7カラムを追加する際、次のように、マイグレーションファイル内でtestカラムのあとにtest7カラムが配置されるよう、afterを使って指定しました。
1 |
$table->integer('test7')->after('test'); |
マイグレーション実行後がこちら。afterがきかず、テーブル内の一番最後に配置されました。

foreignId や unsignedBigInteger は INTEGER 扱い
リレーションを設定したときなどは、マイグレーションファイルでデータ型としてforeignId や unsignedBigIntegerを指定します。
ですが、foreignId や unsignedBigIntegerはSQLite上ではINTEGER
として扱われます。SQLiteでは符号なし整数という概念がなく、実際に負の値も入ってしまう こともあります。
ただ、外部キー制約を加えたい場合には、以下のようにconstrainedを追加できます。
おまけ:constrainedが有効になっているかどうか簡単チェック方法
Laravelでは、config/databaseの下記により、.envに設定がない限り、デフォルトでforeign_key_constraintsがtrue(使える)状態になっています。
【config/databae】
1 2 3 4 5 6 7 8 9 10 |
'sqlite' => [ 'driver' => 'sqlite', 'url' => env('DB_URL'), 'database' => env('DB_DATABASE', database_path('database.sqlite')), 'prefix' => '', 'foreign_key_constraints' => env('DB_FOREIGN_KEYS', true), 'busy_timeout' => null, 'journal_mode' => null, 'synchronous' => null, ], |
そのため、該当カラムのconstrained が有効になっているかどうかは、tinkerを使って、下記コマンドで簡単にチェックできます。
① php artisan tinker コマンドでtinkerを起動
② 下記で該当テーブルの中の外部キー制約機能がONになっているかどうかをチェック
1 |
DB::select("PRAGMA foreign_key_list('テーブル名');") |

testsテーブルのtest8カラムでconstrainedが有効になっていることを示しています
LONGTEXT は SQLite の TEXT と同じ
MySQLのようなTEXT
, MEDIUMTEXT
, LONGTEXT
といった細分化はなく、SQLiteでは「TEXT」として一括りに扱われます。
なお、SQLiteは、MySQLとデータ型の概念が異なり、ストレージや型親和性(Type Affinity)の仕組みに沿って処理を行います。公式ドキュメントによれば、SQLite で取りうるストレージクラスは NULL, INTEGER, TEXT, BLOB, REAL の 5 種類だけです。
database is lockedエラーに注意
SQLiteは単一ファイルを直接操作する形式のデータベースです。そのため、下記の場合に「database is locked」 エラーが起きやすくなります。
- 頻繁に書き込みを行ったりマイグレートを実行
- 長時間トランザクションが開いている
- データベース管理ツールが同じファイルを実行している
(エラー時の画面)
エラーが起こったら、データベース管理ツールやプロジェクトを再起動してみてください。
さいごに
プロジェクトによりますし、小規模なら問題ないかもしれませんが、本番環境ではMySQLなどを使うほうが無難だと感じます。
とはいえ、SQLiteはLaravelでデフォルトで使えますし、軽量で動かしやすく開発環境では便利。
本記事では実際に使う時に注意したほうが良さそうなポイントをまとめましたが、お役にたてば幸いです。