Laravel データベース接続編
やること
- データベースを作成する。
- ユーザーを作成して権限を与える。
- .envファイルを修正する。
- php artisan migrateの実行。
データベースを作成して、ユーザーに権限を与える
MySQLをインストールして、データベースを作成する。
mysql -u root //MySQLに接続 create database 'db_name'; //DB作成 show databases; //DBが作成されたか確認
次に、ユーザーを作成しデータベースに対する権限を与える。
//ユーザー作成。 create user 'user_name'@'%' identified by 'password'; // %はワイルドカードで、どんなホスト名がここに入ってもOKということになる。 //ユーザーに権限を付与。 GRANT ALL ON <db_name>.* TO 'user_name'@'%'; //どんな権限がどこに付与されているのか確認。 show grants for 'user'@'%'; //設定を確実に反映させる。 flush privileges
MySQL8.0 認証方式を変更する
私はまずここでハマりました。
このままデータベースの設定を終えて、進めて最後にマイグレーションを実行すると
$ php artisan migrate Illuminate\Database\QueryException : SQLSTATE[HY000] [2054] The server requested authentication ・・・
というエラーが発生してしまいます。
MySQLはそれぞれのアカウントが「どうやって認証されるべきか」をアカウント情報の中に持っている(5.6とそれ以降) mysql.user テーブルには plugin というカラムがあり、 MySQL8.0では、 mysql_native_password ではなく、caching_sha2_password がデフォルトの認証プラグインとなりました。
SELECT user, host, plugin FROM mysql.user; //既存ユーザーの認証方式を確認。 +------------------+-----------+-----------------------+ | user | host | plugin | +------------------+-----------+-----------------------+ | vagrant | 127.0.0.1 | caching_sha2_password | | vagrant | 192.168.% | caching_sha2_password | | mysql.infoschema | localhost | mysql_native_password | | mysql.session | localhost | mysql_native_password | | mysql.sys | localhost | mysql_native_password | | root | localhost | caching_sha2_password | | vagrant | localhost | caching_sha2_password | +------------------+-----------+-----------------------+
この場合、root@localhost は caching_sha2_password で認証される、という設定になっています。
MySQLの認証はチャレンジ・レスポンス認証なので、クライアント(今回はLaravel)とサーバー(MySQL)で同じ認証形式をサポートしている必要があります。
Laravel5.6のDB接続機能ではこの方式に対応していないので、ユーザーの認証方式を変更する必要があります。
alter user 'username' identified with mysql_native_password by 'password';
これで完了!
.envファイルの設定変更
データベースの設定を終えた段階でマイグレーションを実行すると、以下のようなエラーが出てきます。
Illuminate\Database\QueryException : SQLSTATE[HY000] [1045] Access denied for user ・・・
次に.envの中身を作成したデータベースに応じて書き換えなければいけません。
.env は開発環境やステージング環境、本番環境などで、環境毎に変更したい情報をまとめておくファイルのこと。
Composer経由でLaravelのプロジェクトを作成すると.envファイルが作成されます。
それでは、.envファイルにデータベースの設定をします。
[.env] DB_CONNECTION=mysql DB_HOST=127.0.0.1 //localhostに変更 DB_PORT=3306 DB_DATABASE=homestead //変更 DB_USERNAME=homestead //変更 DB_PASSWORD=secret //変更
変更するのはこの箇所。
さらに、
念のため.env.exampleとconfig/database.phpも作成したDBに応じて変更します。
ただ、マイグレーションを実行した時に先に読まれるのは、database.phpではなく、.envだそうです。
[config/database.php] 'mysql' => [ 'driver' => 'mysql', 'host' => env('DB_HOST', 'localhost'), #変更 'port' => env('DB_PORT', '3306'), 'database' => env('DB_DATABASE', 'tutorial'), #変更 'username' => env('DB_USERNAME', 'root'), #変更 'password' => env('DB_PASSWORD', ''), #変更 'unix_socket' => env('DB_SOCKET', ''), 'charset' => 'utf8mb4', 'collation' => 'utf8mb4_unicode_ci', 'prefix' => '', 'strict' => true, 'engine' => null, ],
.envの変更を反映させる
.envを変更した後に、こちらを実行すると反映されます。
php artisan config:cache
こちら
を参考にさせていただきました。
以上で、データベース接続に関するだいたいのエラーは解消されそう!
残る疑問...
実は、一つ解消できなかった問題があります。
今回作成したユーザーに権限を与えて、そのユーザーを使ってデータベース接続をしたかったのですが、何度やってもエラー。。
ユーザー作成
↓
権限付与
↓
flushで設定を反映
↓
.env書き換え
↓
.env変更を反映
↓
php artisan migrateの実行
同じ手順を踏んでいるのに、
Illuminate\Database\QueryException : SQLSTATE[HY000] [1045] Access denied for user ・・・
こちらのエラーが出続けるんです。
ユーザーをrootに切り替えたらすんなり実行できました。
しばらく戦いましたが出口が見えてこないので、
この課題は持ち帰ります。。