Laravel 6でのSQLiteでのマイグレーション時のエラーへの対処
Laravelにはデータベースのテーブル作成や編集などを管理する方法として,マイグレーションと呼ばれる機構が用意されている。直接 CREATE TABLE文やALTER TABLE文などを発行せずに,PHPのソースコードとしてテーブル作成や変更を管理する仕組みだ。
マイグレーションの流れ
マイグレーションは,マイグレーションファイルとデータベースに作成されるmigrationsテーブルを利用して管理される。
具体的には以下の手順で行う。
php artisan make:migration xxx
コマンドを実行 (xxxは任意の名前)- マイグレーションファイルyyyy_mm_dd_hhmmss_xxx がdatabase/migrations/に作成される。
- マイグレーションファイル内のupメソッド内に,テーブルの作成手順をスキーマビルダで記述する。
- マイグレーションファイル内のdownメソッド内にupメソッド内の手順を巻き戻す手順をスキーマビルダで記述する。
- php artisan migrateコマンドでマイグレーションを実行
- データベースにmigrationsテーブルが作成される (初回のみ)
- マイグレーションファイルの記述が実行され,テーブルが作成・変更される。
- migrationsテーブルに実行されたマイグレーションファイルが記録される。
作成日: ,https://senooken.jp/post/2020/03/30/
Laravel 6でのSQLiteでのマイグレーション時のエラーへの対処
Ubuntu 18.04上のLaravel 6.16.0でマイグレーションを試すとエラーが出てはまったので記録を残す。
ローカル環境で動作を確認したかったので,DBサーバーなしで済むSQLiteを使おうと,.env
ファイルでDB_CONNECTION=sqlite
を指定した。
その後,以下のコマンドでマイグレーションを実行したところ,エラーが出てしまった。
php artisan migrate
Illuminate\Database\QueryException : Database (laravel) does not exist. (SQL: select * from sqlite_master where type = 'table' and name = migrations)
エラーを見ると,laravel
名前ののデータベースがないというエラーが出ている。
調べたところ,config/database.php
内で以下のようにコネクターの設定でDB_DATABASE
の環境変数を参照していた。
'connections' => [
'sqlite' => [
'driver' => 'sqlite',
'url' => env('DATABASE_URL'),
'database' => env('DB_DATABASE', database_path('database.sqlite')),
'prefix' => '',
'foreign_key_constraints' => env('DB_FOREIGN_KEYS', true),
],
そのため,.env
内でDB_DATABASE
環境変数に値を空にするか,設定箇所をコメントアウトして,DB_DATABASE
環境変数に値を入れないことで,対応できた。
ただし,今度は別のエラーが出てしまった。
php artisan migrate
Illuminate\Database\QueryException : Database (/home/senooken/project/example/PHP/Laravel/example.chap2/database/database.sqlite) does not exist. (SQL: select * from sqlite_master where type = 'table' and name = migrations)
今度はdatabase/database.sqlite
がないというエラーが出ている。
このファイルはデフォルトでは存在しないので,空ファイルを用意してやる。例えば,以下のtouchコマンドで用意する。
touch database/database.sqlite
今度はうまく実行できた。
「Laravelリファレンス[Ver 5.1LTS対応]」のサンプルを読みながら,Laravelについて勉強していた。
書籍内では説明や付属サンプルコードでは特に問題なかったのだが,おそらくconfig/database.php
がLaravel 5.1と6とで内容が変わったためだろう。
流行りのフレームワークはバージョン違いで細かい挙動が変わってくるのでなかなかやっかいだ。ひとまず解決できてよかった。