MySQLことはじめ

## はじめに
筆者は、実はほとんどSQLデータベースを使ったことがありませんでした。せいぜいSQLiteをNode.jsで簡単に使ったり、Microsoft SQL ServerをASP.NETで脆弱性たっぷりに使った程度です。[^1]
そこで、今回はMySQLをM3 macOSにインストールして、Node.jsから使ってみたいと思います。

## 環境
- M3 MacBook
- macOS 15.5
- Node.js v22.16.0
    - Express.js
    - EJS
    - Express-Generator
    - npm-check-updates

## MySQLをインストール
[2.4 Installing MySQL on macOS](https://dev.mysql.com/doc/refman/8.4/en/macos-installation.html)を見ながらインストールします。Mac向けには「ネイティブ・パッケージ」が配布されているようです。[2.4.2 Installing MySQL on macOS Using Native Packages](https://dev.mysql.com/doc/refman/8.4/en/macos-installation-pkg.html)に飛んで、hereというそれらしいリンクを踏みます。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3085782/a06bdb8f-ca0c-4259-87f2-8fad9fdea7eb.png)

OSバージョンを`macOS 15 (ARM, 64-bit)`にして、DMGアーカイブをダウンロードします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3085782/6e278bd0-6f46-46a1-9e95-8576e92b7bd8.png)
「Download」ボタンをクリックしたあと、ログインするか尋ねられましたが、めんどくさかったので「No thanks, just start my download.」をクリックしました。

dmgファイルを開くと中にpkgがあるのでクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3085782/8cc2a378-3c35-49d9-8d18-fbf9a9b0a9fb.png)

このあと「rootのパスワード」を求められ困惑しましたが、どうやらデータベースのrootユーザの話だそうです。パスワードを設定して、ウィザードを閉じます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3085782/4595df8c-f193-4d91-9f05-0e7be514f421.png)
まずはインストールできました！　なお、もちろんですがLaunchpadには追加されません。

## MySQL Workbenchをインストール
Microsoft SQL Serverのときは管理ツールがあったので、MySQLでもあるだろうと思い、探してみます。

探したらありました。MySQL Workbenchです。https://dev.mysql.com/downloads/workbench/ からダウンロードし、今回はドラッグ＆ドロップでインストールします。

なお、今回は最初から自分のサーバが登録（？）されていました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3085782/a4e273d6-de73-4cd8-b4cc-d7c0cc65fbcb.png)
しかし、バージョンが合っていない、というメッセージが表示されました。とりあえず動作させたいだけなので無視してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3085782/421a34f0-536d-4949-8878-d9070c87372c.png)
起動しました！

## テーブルを作る
まず、スキーマとやらを作成してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3085782/0178be26-6d5b-4b5e-8dfc-e4889eb4962c.png)

次に、テーブルを作ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3085782/c85280a0-5c08-4d14-aa6d-c3edcd08cac2.png)

できました！

テーブルにダミーデータを挿入します。今回はSQLでやってみます。
```sql
INSERT INTO my_schema.comments (comment,created_at) VALUE("初めてのMySQL",now());
```
```sql
INSERT INTO my_schema.comments (comment,created_at) VALUE("これからのMySQL",now());
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3085782/5056f0d4-3518-403a-8ade-fe1f60ab79a8.png)
うまく実行できました！

ここで、権限の設定をしておいたほうがいいと聞いたので、ユーザを新規作成し、SELECTだけできるように設定しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3085782/cb01109b-11ec-454f-bb23-682d8eb8e2d9.png)

## Node.jsで使う
[Node.js MySQL](https://www.w3schools.com/nodejs/nodejs_mysql.asp)と、[Node.jsアプリケーションとMySQLを接続しよう！](https://prog-8.com/docs/nodejs-mysql)によると、`mysql`パッケージを使ったら簡単にできることがわかりました。

しかし、ここで問題が起こりました。試しにコードを書いて実行すると、`Client does not support authentication protocol requested by server; consider upgrading MySQL client`エラーが出てしまいましたが、[Node.js 【MySQL 8.0 に接続できない。】](https://qiita.com/harukin721/items/99c606364a012cceb0d8)で同じエラーについて書かれていたため、解決しました。今回はバージョン9.3.0をインストールしましたが、`mysql2`パッケージを使う必要があるようです。



<details><summary>EJSを使ったindex.ejsのコード</summary>

```html
<!DOCTYPE html>
<html>
  <head>
    <title>MySQLのコメント欄テスト</title>
  </head>
  <body>
    <h1>MySQLのコメント欄テスト</h1>
    <% for(let comment of comments) { %>
      <p><%= comment.name %> : <%= comment.comment %></p>
    <% } %>
  </body>
</html>
```
</details>

また、JSコードは以下のとおりです。
```js:index.js
var express = require('express');
var router = express.Router();
let mysql2 = require('mysql2');

/* GET home page. */
router.get('/', function(req, res, next) {
  //MySQLデータベースからコメントをもらう
  let con = mysql2.createConnection({
    host: "localhost",
    user: "read_user",
    password: "read_user_a8",
    database:"my_schema"
  });

  con.connect(function(err) {
    if (err) throw err;
    console.log("Connected!");
    con.query("SELECT comment,created_at FROM comments", function (err, result) {
      if (err) throw err;
        res.render('index', { comments:result });
    });    
  });
  
});

module.exports = router;
```

## 実行！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3085782/42d4a743-8357-4179-9a53-e774974e14d8.png)

動いた！！

## 感想
まず、MySQLは全体的に使いやすかったです。
- 調べなくてもUIがわかりやすいし
- ライブラリも使いやすいし
- 情報も多いし
- とっつきやすい

初めてのMySQL体験でしたが、とても良かったです。これからプロジェクトでデータベースを使うときはMySQLも使っていきたいなと思いました。

[^1]:[SQLインジェクション](https://www.ipa.go.jp/security/vuln/websecurity/sql.html)。まあ、ローカルな運用なので良かったですが......