Laravel6.0でmigrateできなかった時の対処方法
4分目次
エラーメッセージ
$ php artisan migrate
Illuminate\Database\QueryException : SQLSTATE[HY000] [2002] No such file or directory (SQL: select * from information_schema.tables where table_schema = laravel and table_name = migrations and table_type = 'BASE TABLE')
at /../vendor/laravel/framework/src/Illuminate/Database/Connection.php:669
665| // If an exception occurs when attempting to run a query, we'll format the error
666| // message to include the bindings with SQL, which will make this exception a
667| // lot more helpful to the developer instead of just the database's errors.
668| catch (Exception $e) {
> 669| throw new QueryException(
670| $query, $this->prepareBindings($bindings), $e
671| );
672| }
673|
Exception trace:
1 PDOException::("SQLSTATE[HY000] [2002] No such file or directory")
/../vendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php:70
2 PDO::__construct("mysql:host=localhost;port=8889;dbname=laravel", "root", "root", [])
/../vendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php:70
Please use the argument -v to see more details.
環境
- Laravel 6.0
- MAMP
対処法
僕の場合は.env
ファイルの DB への設定が足りなかった。
DB_SOCKET=/Applications/MAMP/tmp/mysql/mysql.sock
細かい説明
Laravel プロジェクトを立ち上げると、.env
ファイルのデフォルトはこう。
== 省略 ==
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=
== 省略 ==
で、この DBHOST やら DBUSERNAME を確認するためにMAMPにアクセスするとこんな記述がある。
デフォルトと違うのはポート番号と mysql.sock が指定されていないこと。なので MAMP に合わせて指定してあげればいい。
== 省略 ==
DB_CONNECTION=mysql
DB_HOST=localhost
DB_PORT=8889
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=root
DB_SOCKET=/Applications/MAMP/tmp/mysql/mysql.sock
== 省略 ==
また、DB_DATABASE についても laravel という DB がなければ当然エラーになるため、MAMP を起動してphpMyAdminから確認してみるといい。
ここまでやると
$ php artisan migrate
Migration table created successfully.
migrate できた。
別の対処法
.env ファイルをあまりにいじっている人は
$ php artisan config:cache
でキャッシュを削除すると直るケースもあります。
database.php を編集する方法
よくconfig > database.php
を編集してエラー対処する記事を見かけますが、あまり意味ないような気がします……。
略
'mysql' => [
'driver' => 'mysql',
'url' => env('DATABASE_URL'),
'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PORT', '3306'),
'database' => env('DB_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
'unix_socket' => env('DB_SOCKET', ''),
略
上の第 2 引数(DB_*の後ろの文字列。例えば 3306 や forge など)を変更する方法ですね。env 関数(laravel のヘルパー関数)の第 2 引数はデフォルト値で、.env ファイル内で DBHOGE が設定されていないときのみ渡される値です。つまり、DBHOGE を.env ファイルで設定している場合においては database.php 並びに env 関数内がエラー原因足りうるケースは想定しづらいです。なので、他の部分にフォーカスした方がいい気がします。
ターミナルから DB 確認
ターミナルで新しいウィンドウを開き、
$ cd /Applications/MAMP/Library/bin/
$ ./mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
実行。(パスワードはデフォルトだと root。)USE
文で使用するデータベースを選択。今回で言えば laravel。
mysql> use laravel;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
show tables;
で作成したテーブルが見れる。
mysql> show tables;
+-------------------+
| Tables_in_laravel |
+-------------------+
| failed_jobs |
| migrations |
| password_resets |
| users |
+-------------------+