LoginSignup
0
1

Laraverlのマイグレーションではまった話

Posted at

概要

  • マイグレーションを行ったところ、実行順でテーブル作成ができず解決に時間がかかってしまった

事象概要

$ php artisan migrate

Deprecated: PHP Startup: Use of mbstring.internal_encoding is deprecated in Unknown on line 0

   INFO  Running migrations.

  2024_04_17_135308_XXX_XXX_XXX ............................................................. 622ms FAIL

   Illuminate\Database\QueryException 

  SQLSTATE[HY000]: General error: 1824 Failed to open the referenced table 'ZZZ' (Connection: mysql, SQL: alter table `YYY` add constraint `YYY_XXX_ZZ_foreign` foreign key (`XXX_ZZ`) references `ZZZ` (`hoge`))

  at vendor/laravel/framework/src/Illuminate/Database/Connection.php:829
    825▕                     $this->getName(), $query, $this->prepareBindings($bindings), $e
    826▕                 );
    827▕             }
    828▕
  ➜ 829▕             throw new QueryException(
    830▕                 $this->getName(), $query, $this->prepareBindings($bindings), $e
    831▕             );
    832▕         }
    833▕     }

      +9 vendor frames 

  10  database/migrations/2024_04_17_135308_XXX_XXX_XXX.php:11
      Illuminate\Support\Facades\Facade::__callStatic("create")
      +24 vendor frames 

  35  artisan:35
      Illuminate\Foundation\Console\Kernel::handle(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))

このような形で、エラーが発生していた

解決法

簡単にエラーの内容をまとめると、外部キー制約によりあるはずのテーブルが存在しないために発生している

そのため、生成順を気を付ける必要がある

参考サイト

参考サイトにもあるように、生成順をいじるにはマイグレーションファイルの先頭にあるYYYY_MM_DD_hhmmssが古い順で実行されるため、実行が速くあるべきものを前に行くように調整する必要がある

php artisan migrate

本来はこれを行うことで、古い順から再実行されるはずであるが、いろいろとやりすぎたせいか自分は以前の順番で実行されてしまった。

そこで今回残したいデータはなかったこともあり、データをすべて削除して再実行するように変更した

データをすべて消す処理を事前に挟むため、やむを得ない場合を除きほかの手段を利用することを推奨します。
また、もし本番環境で実行する場合は必ずバックアップを取るようにしましょう。
本当にすべてのテーブルを削除するので注意です

php artisan migrate:fresh

これをすると、テーブルが初期化されるためすでにテーブルがある等のエラーがなく、単に順番による依存関係のみを考えればよくなります。

が、、最終手段なので本番環境を触っている人は注意してください

まとめ

外部制約に苦しめられたが、必ず必要な部分であるため開発段階で調整できてよかった

しかし、今後開発が進む中で運用中のシステムを変える場合は、また違ったアプローチで常に気を使う必要があり、大変に難しい問題であるとも感じた。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1