【Laravel/MySQL】テーブルを作成して接続設定する

もくじ

MySQL

MySQLをDockerに設置している場合は↓こちらをご確認の上、本記事のMySQLの項目をスキップしてください。

bonoponz.hatenablog.com

MySQLを起動

$ mysql.server start
Starting MySQL
 SUCCESS! 

SUCCESS! と出れば起動完了です。

すでに起動している場合は起動コマンドは不要です。私がここで陥った現象を紹介しておきます。

bonoponz.hatenablog.com

MySQLにログイン

$ mysql -u root -p

ホスト名やポート番号を指定したい場合は↓。ポート番号などは任意です。

$ mysql -u root -p -h 127.0.0.1 -P 3307

-uオプションはユーザー名、-hオプションはホスト名、-Pオプションはポート番号です。

-pオプションはパスワードでそのまま続けてコマンド入力することもできますが、パスワードが画面上にそのまま表示されてしまいます。それを回避するため、-pオプションだけを指定して実行します。

Enter password:

するとパスワードの入力を求められるのでパスワードを入力してenter。

パスワードを設定していない場合は何も入力せずenterすることでログインできます。

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 10
Server version: 8.0.21 MySQL Community Server - GPL

Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 

このように表示されればログイン成功です。

SQLクエリを実行できるようになります。

現存のデータベースを確認

MySQLにおけるデータベースとは、複数のテーブルをまとめた箱になります。

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+

プロジェクトごとにデータベースを作成すると管理しやすくなるので、使用したいデータベースがない場合は作成しましょう。

新しいデータベースを作成

CREATE DATABASE データベース名;

実際に作成してみます。

mysql> CREATE DATABASE sample;
Query OK, 1 row affected (0.09 sec)

作成したデータベースが追加されていることを確認します。

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sample    |
| sys                |
+--------------------+

データベースを削除

もし間違って作成してしまっても削除ができます。

DROP DATABASE データベース名;

使用するデータベースの選択

USE データベース名;
mysql> USE sample;
Database changed

これで使用するデータベースを指定できました。

テーブルの確認

SHOW TABLES;

新しく作成したデータベースには、初めはもちろんテーブルがありません。確認してみます。

mysql> SHOW TABLES;
Empty set (0.00 sec)

テーブルを作成

テーブルを作成する際は、事前にDB設計をしておきます。

DB設計とは、どのようなテーブルがあり、各テーブル内にはどのような列があってそれぞれのデータ型が何なのか、ということを細かく決めておきます。

bonoponz.hatenablog.com

DB設計をもとにテーブルを作成します。

CREATE TABLE [テーブル名] (
    column1 [データ型] [その他オプション],
    column2 [データ型] [その他オプション],
    column3 [データ型] [その他オプション],
);

たとえば、userテーブルを作成する場合は以下のようになります。

mysql> CREATE TABLE user(
    -> id int,
    -> username varchar(255),
    -> email varchar(255),
    -> password char(30)
    -> );
Query OK, 0 rows affected (0.02 sec)

これでuserテーブルが作成されました。

mysql> show tables;
+----------------+
| Tables_in_post |
+----------------+
| user           |
+----------------+

確認すると作成されているのがわかります。

テーブルの中身のフィールドを確認

テーブルの中に何が入っているか確認できます。

mysql> desc user;
+----------+--------------+------+-----+---------+-------+
| Field    | Type         | Null | Key | Default | Extra |
+----------+--------------+------+-----+---------+-------+
| id       | int          | YES  |     | NULL    |       |
| username | varchar(255) | YES  |     | NULL    |       |
| email    | varchar(255) | YES  |     | NULL    |       |
| password | char(30)     | YES  |     | NULL    |       |
+----------+--------------+------+-----+---------+-------+

MySQLを終了

特に終了しなくてもいいですが、終了する場合は以下を実行しましょう。

mysql> exit
Bye

Byeって言われて終わるのって、対話している実感を得られていいですね。

Laravel

データベースができたので、Laravelで使えるように接続設定します。

.envファイルを設定

.envファイルを開くと、9〜14行目に以下の項目があります。

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=

詳細は以下です。

環境変数 概要
DB_CONNECTION データベースの種類
DB_HOST 接続先のホスト
DB_PORT 接続先のポート
DB_DATABASE データベース名
DB_USERNAME ユーザー名
DB_PASSWORD パスワード

今回、sampleという名前のデータベースを作成したので、それをしてします。

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=sample
DB_USERNAME=root
DB_PASSWORD=secret

パスワードは何も設定していないならsecretと書くようです。

保存して設定は完了です。これでDBとLaravelの設定が完了しました。

えっ。めっちゃ簡単。MySQLのほうが大変ですね。

マイグレーションで接続確認

最後に、接続がちゃんとできているか確認しましょう。

$ php artisan migrate

マイグレーション が失敗する

$ php artisan migrate

   Illuminate\Database\QueryException 

  SQLSTATE[HY000] [2054] The server requested authentication method unknown to the client (SQL: select * from information_schema.tables where table_schema = sample and table_name = migrations and table_type = 'BASE TABLE')

なんかエラーが出てしまいました。

MySQLのユーザの権限などのうんたらかんたららしいので、MySQLのユーザーを作成して権限も付与します。

新しくユーザを作成

CREATE USER 'ユーザ名'@'ホスト名' IDENTIFIED BY 'パスワード';

ユーザ名、パスワードには、任意の文字列を設定して下さい。ホスト名には、MySQLへ接続するホストを指定して下さい。ホスト名の代わりにIPアドレスlocalhostを指定することも可能です。

mysql> CREATE USER 'sample'@'127.0.0.1' IDENTIFIED BY 'sample';
Query OK, 0 rows affected (0.02 sec)

ユーザを確認

ユーザごとのホストも確認する。

mysql> SELECT user, host FROM mysql.user;
+------------------+-----------+
| user             | host      |
+------------------+-----------+
| mysql.infoschema | localhost |
| mysql.session    | localhost |
| mysql.sys        | localhost |
| root             | localhost |
+------------------+-----------+

ユーザーごとの認証方式を確認

mysql> select user, plugin from mysql.user;
+------------------+-----------------------+
| user             | plugin                |
+------------------+-----------------------+
| mysql.infoschema | caching_sha2_password |
| mysql.session    | caching_sha2_password |
| mysql.sys        | caching_sha2_password |
| root             | caching_sha2_password |
+------------------+-----------------------+

認証方法を変更する

  • MySQL8.0.4以降 のログイン認証方式は caching_sha2_password がデフォルト。
  • PHPMySQL接続ライブラリが caching_sha2_password に未対応のため接続不可。
  • 解決策としては認証方式を mysql_native_password に戻す

上記の対応が必要のようでした。

とりあえずすべてのユーザの認証を変更します。

mysql> ALTER USER 'mysql.infoschema'@'localhost' IDENTIFIED WITH mysql_native_password BY 'secret';
mysql> ALTER USER 'mysql.session'@'localhost' IDENTIFIED WITH mysql_native_password BY 'secret';
mysql> ALTER USER 'mysql.sys'@'localhost' IDENTIFIED WITH mysql_native_password BY 'secret';
mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'secret';

ここでのパスワードは任意なものにします。

Configのキャッシュを消す

もしかしたら、失敗してた時のキャッシュを読み込んでエラーが出ることもあるので、キャッシュをクリアしましょう。

$ php artisan config:cache

マイグレーションを実行して確認しましょう。

$ php artisan migrate
Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated:  2014_10_12_000000_create_users_table (0.05 seconds)
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated:  2014_10_12_100000_create_password_resets_table (0.02 seconds)
Migrating: 2019_08_19_000000_create_failed_jobs_table
Migrated:  2019_08_19_000000_create_failed_jobs_table (0.01 seconds)

マイグレートできました。

失敗しまくりの環境構築

今回、MySQLの設定してララベルに接続する前でに何日も溶かしました。

本当問題発生しまくりでこれに1週間〜2週間くらいかかりました。

たぶんこのつぶやきらへんから取り組んで、仕事終わりや休日にちまちまエラーと闘って一度や二度は諦めそうになりました。

キャッシュにくし。

参考URL

MySQL :: MySQL 5.6 リファレンスマニュアル :: 3.3 データベースの作成と使用

【MySQL, SQL】データベースを扱う基本SQL一覧 - Qiita

MySQLに接続するユーザー名とパスワードの指定 | MySQLの使い方

【Laravel】MySQLの接続方法を徹底解説【コピペでOK】

【Laravel】MySQL 8でmigration時にエラーが出たときの対処方法 | takakisan

Laravel 6 でmysqlのDBに接続できない!(解決方法) - Qiita

【Laravel】migrateができないのは環境変数が間違っているからかも!あるあるエラーを.envと共に振り返る。 - Qiita

MySQL8.0 認証方式を変更する(Laravel5) - Qiita