LaravelでSQLiteをメモリ上で動かす話
Laravel試験でDBをSQLiteに動作をメモリ上で動かす方法をまとめます。
LaravelにSQLiteを指定するには、環境設定ファイル(.env 試験の場合は .env.testing)に以下を指定します
DB_CONNECTION=sqlite
DB_DATABASE=:memory:
これでOKです!
データベースはmigrationで管理しましょう。
https://laravel.com/docs/9.x/migrations
SQLiteとは
SQLiteはファイルやメモリ上でSQLサーバを構築してくれるものです。
https://www.sqlite.org/index.html
用途としては今回のPCでの軽量DBやスマホのDBなど結構いろんなところで使われています。
今回はこのSQLiteをファイルに書き出して実行するのではなく、メモリ上で動かす!
という話です。
なぜSQLiteで動かすか!
なぜ、SQLiteで動かすか!
もし、試験でDBサーバを使った場合はわざわざサーバを立てるのも大変です。
さらに、自動テストで実行するDBバージョンをmigrationが走ります。
migrationが走るとスキーマの構成が変わりますので同時に試験されるとそれぞれに影響が発生してしまいます。
同じバージョンであったとしても試験でデータを更新されると別の自動テストへ影響が発生するなど…
実現はしないでしょう。
この問題の解決にSQLiteを利用します
SQLiteを利用することによりローカルに自分専用のDBが構築することができる様になります
自動試験は他の自動テストにはアクセスできないため問題は解決できます。
なぜメモリ上で動かすのか!
なぜメモリ上で動かすのかというと
SQLiteは何も指定がなければsqliteファイルにDBを構築します。
それは今回利用するのが試験であるからです。
つまりは動作を確認するだけで永続化する必要がないからです。
https://www.sqlite.org/inmemorydb.html
ファイルで作成するのではなくメモリ上で展開するにはファイル名を :memory: とすることで出来ます。
終いに
今回はLaravelでSQLLiteのインメモリで実行する方法を書きましたが、裏話としては…
調査不足でLaravel本体への変更が必要だと記事を書くまで思っていましたw
この部分がポイントでした。
'database' => env('DB_DATABASE', database_path('database.sqlite')),
てっきり、DB_DATABASEをファイル名と勘違いしていましたw
それだけですw