読者です 読者をやめる 読者になる 読者になる

Debug My Life.

いろいろデバッグをがんばるブログ。

php artisan migrateのエラー確認方法

Laravel系

LaravelのMigrationファイルをDBに反映するコマンド:php artisan migrateを実行してエラーになったときに、以下のようにコンソール上はエラー箇所がよく分からないことが多い。

php artisan migrate
Migration table created successfully.

  [Illuminate\Database\QueryException]
  SQLSTATE[42S01]: Base table or view already exists: 1050 Table 'users' already exists (SQL: create table `users` (`id` int unsigned not null auto_increment primary key, `name  
  ` varchar(255) not null, `email` varchar(100) not null, `password` varchar(255) not null, `remember_token` varchar(100) null, `created_at` timestamp null, `updated_at` timest  
  amp null) default character set utf8mb4 collate utf8mb4_unicode_ci)           

  [PDOException]
  SQLSTATE[42S01]: Base table or view already exists: 1050 Table 'users' already exists  

一見Migration table created successfully.と出力されているから正常終了しているように見えるけど、作成されたテーブルをmysqlのshow tables;で確認すると、複数あるMigrationファイルの一つでエラーになって、すべてのMigrationファイルが実行されていないことがわかる。

こういうときは、storage/logs/laravel.logをチェックするとエラーとなっているmigrationファイルを特定できる。そして、普通に参照すると余計なエラーメッセージも出力されて一見わかりにくいので、以下のコマンドのように実行日付をgrepでパイプで渡してやると、ピンポイントで該当エラーファイルを特定できるのでおすすめ。

tail -200 storage/logs/laravel.log | grep 2017-02-01
[2017-02-01 20:38:02] local.ERROR: Symfony\Component\Debug\Exception\FatalThrowableError: Class 'Scheme' not found in /var/www/mice/laravel/database/migrations/2017_01_29_203457_create_mst_objectives_table.php:16
[2017-02-01 20:38:48] local.ERROR: Symfony\Component\Debug\Exception\FatalThrowableError: Call to undefined function create() in /var/www/mice/laravel/database/migrations/2017_01_29_203501_create_mst_lines_table.php:16

あと、途中までMigrationファイルで作成さたテーブルがある状態で、再度php artisan migrateをやるとすでに同名の既存テーブルがあるとエラーになってしまうので、php artisan migrate:rollback(一つ前にロールバック)かphp artisan migrate:reset(全マイグレーションロールバック)で重複テーブルがない状況にしてmigrateを再実行すれば良い。

マイグレーションと初期値設定 5.dev Laravel

migrationsテーブルに操作履歴が残っているので、このテーブルの中身を手動でdeleteするとphp artisan migrate:rollbackを実行しても戻せるロールバックがないというようなエラーになるので注意。そうなってしまって、不要テーブルを消すときはdrop table テーブル名で地道に消していくしかない。

エラーが出るとブログ書くネタができた!!、などと思いながら最近はいろいろやっているかな。