Laravelでmigrateを行ったとき、こんなメッセージが出てきたときの対処法です。
「Illuminate Database QueryException」
また、今後のmigrateエラーを回避するための2つの対策を紹介します。
migrate rollbackをしよう
まずはRollbackをしましょう。
「間違えたから1回戻る」コマンドです。
rollbackのおすすめ手順
まずは今、どこまで反映されているか確認します。
①phpMyAdminにログインして「migrations」をクリックします。
②テーブル一覧が出てきます。一番下にあるのが、最新のテーブルです。
migrate するごとに、batch番号(上記表の右側)が増えていきます。
Rollbackを1度かけると、一番大きいbatch番号のmigrationファイルがまとめてRollbackされます。
③コマンドラインに migrate:rollback を入力します。
1 |
php artisan migrate:rollback |
ちなみに、1回分ではなく、もっと前に戻す!ことも可能です。
たとえば5回前に戻すときは、次のように入力します。
1 |
php artisan migrate:rollback --step=5 |
ただ分かりにくくなるので、1回ずつ実施するほうが良いかと思います。
④もう一度phpMyAdminにログインします。
きちんとテーブルが削除されているのを確認しましょう。
⑤マイグレーションファイルは手動で削除してもOKですし、修正して、再度使ってもOK。
⑥テーブルを作りなおし、再度 migrate を実行します。
migrate reset と migrate refresh
おすすめはrollbackですが、もう少し過激(?)な方法もあります。
migrate reset を行うと、すべてのマイグレーションをロールバックしてくれます。
1 |
php artisan migrate:reset |
migrate refresh を行うと、すべてのマイグレーションのロールバックに加え、migrateもしてくれます。
1 |
php artisan migrate:refresh |
該当箇所のマニュアルはこちら。
rollbackがテーブルをひとつずつ削除していたことに比べると、スピーディです。
ただ、これまでテーブルに入っていたデータが消えてしまので要注意。
ロールバックをひとつずつ行っていくほうが安全かと思います。
migrate トラブル防止のための対策2点
今後、migrate トラブルが起こらないようにするための対策を2つ紹介します。
migrate後、マイグレーションファイルは直接編集しない
トラブルの原因ですが、手動でマイグレーションファイルを操作してしまったりすることが原因です。
マイグレートを行った後は、直接、マイグレーションファイルを編集しないようにしましょう。
テーブルにカラム(列)を変更したり、データ型を変えたりするのは、コマンドを使って行いましょう。
カラムを加えたりした後に down を記述すること
マイグレーションファイルを新たに作成すると、ファイルの削除に関するコードが自動で入ってきます。
ファイル下部の function down()の下です。
1 2 3 4 |
public function down() { Schema::dropIfExists('posts'); } |
ところが、カラムを追加したりした時にできるマイグレーションファイルでは、function down()の項目は空欄になっています。
自分でdropメソッドを入力せねばいけません。
たとえば、新たに【admin】というカラムを追加したときは、次の一行を追加します。
1 |
$table->dropColumn('admin'); |
ここを入れ忘れていると、きれいに削除できなかったりするので、注意しましょう。
さいごに
今回は、自分の失敗をもとに作成しました。
まとめますと、migrationエラー解決・回避のためのポイントは次の3点です。
- データベースエラーがでたら、Rollbackをして操作をやり直す
- データベースは一度マイグレートしたら、コマンドを使って編集するのが安全
- マイグレーションファイルのfunction down も忘れずに書いておこう