MySQL インストールから接続(Symfony)までの流れ

# 環境
- mysql  Ver 8.0.22 for osx10.15 on x86_64 (Homebrew)
- プロジェクトディレクトリのターミナルと、MySQLにログイン状態のターミナル(MySQLインストール後)2つを並べて多くと効率的
- SQLにはrootユーザーで接続の場合

> プロジェクトの必要に応じて接続ユーザーは考慮してください。


# MySQLインストール
`brew install mysql`

# MySQL起動
`mysql.server start`

# MySQLログイン
`mysql -u root`
ログインユーザーの root は初期導入後はパスワードが設定されていないため、パスワード無しでログインできる。


# MySQL導入時に存在するDBを確認
`SHOW DATABASES;`

```SQL
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
```
導入時に既にいくつかDBの確認があるがけさないこと。

#MySQL rootユーザーのパスワード設定
現在のログインユーザーのrootのパスワードを確認

### mysql DBへ切り替える
`use mysql;`でユーザー 情報が保存しているDBに切り替える
### userテーブルを表示
フィールドがたくさんあるので以下のフィールドを指定
※以前のバージョンはPasswordフィールドが合ったようだが8.0にはないので注意
`SELECT Host, User FROM mysql.user;`

```SQL
+-----------+------------------+
| Host      | User             |
+-----------+------------------+
| localhost | mysql.infoschema |
| localhost | mysql.session    |
| localhost | mysql.sys        |
| localhost | root             |
+-----------+------------------+
```
### パスワード設定
`mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'root-password';`でユーザー 情報が保存しているDBに切り替える
※root-passwordに設定したいパスワードを記入

#MySQL ログアウトしてログインしてみる(確認)
ログアウト
`exit`
ログイン
`mysql -u root -p`
先程パスワードを設定したので必ず「-p」をつける。パスワード入力できる状態になるので入力してログイン。

# 新規にDBを作成する (必要な場合)
Doctrine経由で作成するのだが、MySQL8.0で認証方法の設定を変更しておく必要があるので先に行う。

### rootユーザーの認証方法を確認
- SQLにログイン `mysql -u root -p`
- mysql DBに切り替える`use mysql`
- userテーブルのpluginフィールドを確認`SELECT user, host, plugin FROM user;`

```
+------------------+-----------+-----------------------+
| user             | host      | plugin                |
+------------------+-----------+-----------------------+
| mysql.infoschema | localhost | caching_sha2_password |
| mysql.session    | localhost | caching_sha2_password |
| mysql.sys        | localhost | caching_sha2_password |
| root             | localhost | caching_sha2_password |
+------------------+-----------+-----------------------+
4 rows in set (0.00 sec)
```

- caching_sha2_passwordをmysql_native_passwordに変更
`ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'root-password';`

- 設定が変わっているか確認
`SELECT user, host, plugin FROM user;`

```
+------------------+-----------+-----------------------+
| user             | host      | plugin                |
+------------------+-----------+-----------------------+
| mysql.infoschema | localhost | caching_sha2_password |
| mysql.session    | localhost | caching_sha2_password |
| mysql.sys        | localhost | caching_sha2_password |
| root             | localhost | mysql_native_password |
+------------------+-----------+-----------------------+
4 rows in set (0.00 sec)
```

参考記事: https://blog.janjan.net/2018/11/01/mysql8-request-authentication-method-unknown-to-the-client/

### Symfonyの設定ファイルを変更
`.env`ファイルを変更。まだこのプロジェクト用のDBはないが次のステップで作成するので、(db_name)にはこれから作るDB名を入力しておく。

編集前

```.env
DATABASE_URL=mysql://db_user:db_password@127.0.0.1:3306/db_name?serverVersion=5.7
```

編集後

```.env
DATABASE_URL=mysql://root:(最初の方で設定したrootのパスワード)@127.0.0.1:3306/(db_name)
```

### Doctrine経由でDB作成
` php bin/console doctrine:database:create;`する。以下表示されればOK。確認したい人はSQL側で`show databases;`で確認。

```
Created database `(db_name)` for connection named default
```

> 注意：以下エラーが出た場合は、SQL側で接続ユーザーの認証方法をmysql_native_passwordにしないとエラーが出るので2つ前の設定をしっかりすること。

```
SQLSTATE[HY000] [2054] The server requested authentication method unknown to the client
```

# Doctrine経由でテーブル作成
ざっくりメモ
- `php bin/console make:entity`Entityファイルを作成(プロパティを決めます)
- `php bin/console make:migration`マイグレーションファイル作成(DBに反映する設定情報のファイルを作ります)
- `php bin/console doctrine:migrations:migrate`マイグレーション実行(DBに変更を反映します)
- テーブルが新規作成もしくは情報が更新される
- SQLにログインしているターミナルで`show tables;`でちゃんとテーブルが作られているか確認

```
+------------+---------------+------+-----+---------+----------------+
| Field      | Type          | Null | Key | Default | Extra          |
+------------+---------------+------+-----+---------+----------------+
| id         | int           | NO   | PRI | NULL    | auto_increment |
| name       | varchar(255)  | NO   |     | NULL    |                |
| zip_code   | int           | NO   |     | NULL    |                |
| address    | varchar(255)  | NO   |     | NULL    |                |
| open_time  | int           | NO   |     | NULL    |                |
| close_time | int           | NO   |     | NULL    |                |
| map        | varchar(1000) | NO   |     | NULL    |                |
+------------+---------------+------+-----+---------+----------------+
7 rows in set (0.00 sec)
```

- SQLにログインしているターミナルで`DESCRIBE (テーブル名);`でちゃんとフォールドが設定されているか確認

```
+------------+---------------+------+-----+---------+----------------+
| Field      | Type          | Null | Key | Default | Extra          |
+------------+---------------+------+-----+---------+----------------+
| id         | int           | NO   | PRI | NULL    | auto_increment |
| name       | varchar(255)  | NO   |     | NULL    |                |
| zip_code   | int           | NO   |     | NULL    |                |
| address    | varchar(255)  | NO   |     | NULL    |                |
| open_time  | int           | NO   |     | NULL    |                |
| close_time | int           | NO   |     | NULL    |                |
| map        | varchar(1000) | NO   |     | NULL    |                |
+------------+---------------+------+-----+---------+----------------+
7 rows in set (0.00 sec)
```