はじめに
この記事はLaravel SailやDockerなどのプロジェクトで、DB周りの問題にぶち当たって受け出せない人のための記事です。
今回言語はPHP、フレームワークはLaravel、RDBSはMySQLを使ってますが、他の構成(Ruby on Rails, Django, PostgreSQLなど)でも役に立つ内容になるかと思います。
概要
ローカルホストにアクセスして、こんな感じのメッセージが出てきてませんか?
SQLSTATE[HY0001 |2002] Connection refused (Connection: ...以下略
あるいはDocker Desktopのコンテナをみると、MySQLのcontainerだけExcitedになってませんか?
この手の問題に出くわしたら対処すべき2 Stepがあります。
- DBの情報を正しく設定する
- 正しく設定したDB情報を反映する
原因は大体DB情報が間違っている、あるいは正しいけど情報が反映されていない、のどちらかかと思われます。
具体的にどうやって解決するかをまとめていきたいと思います。
チェックすべきファイル
- ./.env ... 環境変数をまとめるファイル
- ./docker-compose.yml ... Docker Composeを実行するためのファイル
- ./config/database.php ... データベースの設定を管理するための設定ファイル
- ./config/queue.php ... キューシステムの設定を管理するための設定ファイル
アプリケーションとDBと接続するには MYSQL_DATABASE とか DB_USERNAME といったような環境変数を正しく設定する必要があります。
この環境変数が書かれているのが主に上の4つファイルのいずれか、またはすべてです。
でもって、Laravel 11でLaravel sail公式のチュートリアルのままやってエラーになるので修正が必要だったりします。そのまま動いたらいいのに...
https://embed.zenn.studio/card#zenn-embedded__90b81b3fefc49
DBの情報を正しく設定する方法5選
ということで、ここからは動かない原因とその対処法をざっと紹介していきます。
まずはDBの設定周りから。
1.使用するRDBSを変更する
Laravel Sail v11.xではデフォルトだとSQLiteが設定されているので、MySQLなど使いたい場合はこれを変更する必要があります。
具体的にはDB_CONNECTIONでファイル内検索をかけ、その値を任意のRDBS名に変えます。例えばMySQLの場合は下記のようにします。
# NG
DB_CONNECTION=sqlite
# OK
DB_CONNECTION=mysql
# NG
'default' => env('DB_CONNECTION', 'sqlite'),
# OK
'default' => env('DB_CONNECTION', 'mysql'),
*queue.phpには変更箇所が2箇所あります。
# NG
'default' => env('DB_CONNECTION', 'mysql'),
# OK
'default' => env('DB_CONNECTION', 'sqlite'),
*database.phpには変更箇所が default, database, prefix の3箇所あります。
2.DB_HOSTを変更する
DB_HOSTという接続先ホストアドレスを指定する環境変数がありますが、これを変更します。
公式サイトがMySQLならmysqlにしてね、と言ってます。
https://embed.zenn.studio/card#zenn-embedded__d093268e70cc8
# NG
DB_HOST=127.0.0.1
# OK
DB_HOST=mysql
# NG
mysql:
environment:
MYSQL_ROOT_HOST: '%'
# OK
mysql:
environment:
MYSQL_ROOT_HOST: '${DB_HOST}'
${DB_HOST} とすることで .env に設定した DB_HOST を読み取ります。
# NG
'mysql' => [
'host' => env('DB_HOST', '127.0.0.1'),
]
# OK
'mysql' => [
'host' => env('DB_HOST', 'mysql'),
]
env('DB_HOST', 'mysql') とすることで、第1引数で .env に設定した DB_HOST を読み取り、失敗したら第2引数の値を設定します。
ところで database.php は 'connections' => [ ... ] 内に他にもsqliteやmariadbなどの記述がありますが、使わないRDBSは削除してOKです。
![[Laravel Sail v11.x, Docker] DBエラーにぶち当たったときに試すこと9選](/_next/image?url=https%3A%2F%2Fimages.microcms-assets.io%2Fassets%2F674fbf2fe21c4dc1999adeb8abf750c1%2Ff356986694fd4c439ae92d6ceaa85d3d%2F16.png&w=3840&q=75)



