LOLIPOP!マネージドクラウドでMySQLデータベースを利用する

# はじめに
[LOLIPOP!マネージドクラウド](https://mc.lolipop.jp)の`Node.js`プロジェクトでデータベースを利用する方法の備忘録です。

# 目次
1. [データベースの情報を確認する](#1-データベースの情報を確認する)
1. [MySQLのバージョンを確認する](#2-mysqlのバージョンを確認する)
1. [MySQL8.0に対応したmysqlライブラリを使用する](#3-mysql80に対応したmysqlライブラリを使用する)
1. [LOLIPOP!マネージドクラウドのサーバーにSSH接続する](#4-lolipopマネージドクラウドのサーバーにssh接続する)
1. [テーブルの作成](#5-テーブルの作成)
1. [環境変数の設定](#6-環境変数の設定)

# 1. データベースの情報を確認する
`プロジェクト一覧`から作成したプロジェクトを選択し、データベースの情報を確認します。
`データベース名`や`ユーザー名`、`ホスト名`は自動で設定されます。`パスワード`はプロジェクト作成時に入力したパスワードが設定されており、プロジェクト作成後も`パスワードを変更する`リンクから変更できます。

![スクリーンショット 2025-01-26 16.52.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2885419/0ba2c17d-1c71-3304-b39b-c6bf1f01d778.png)


# 2. MySQLのバージョンを確認する
2024年4月からは、新規プロジェクトを作成すると`MySQL8.0`のデータベースが作成されます。

>本日、データベースについて【 MySQL8.0 】を提供開始いたしました。
>これより、新規作成いただくデータベースについては、MySQL8.0 で作成いただけるようになりました。
>
>・すでに作成いただいているデータベースの MySQL バージョンに変更はございません。
>・MySQL5.7 でのデータベース新規作成は提供終了いたしました。
(MySQL8.0 提供のお知らせ：https://note.com/mclolipopjp/n/n3b9bbff6ec61)

データベースの`ホスト名`からもMySQLのバージョンを知ることができます。

| ホスト名 | MySQLのバージョン |
|:-:|:-:|
| mysql-1.mc.lolipop.lan | 5.7 |
| mysql-2.mc.lolipop.lan | 5.7 |
| mysql-3.mc.lolipop.lan | 8.0 |

# 3. MySQL8.0に対応したmysqlライブラリを使用する

:::note warn
`MySQL5.7`を利用している方、既に`MySQL8.0`対応ずみの方はスキップしてください
:::

`Node.js`で`MySQL`を利用するライブラリとして代表的な`mysql`ライブラリは`MySQL8.0`に対応していません。
そこで、今回は[`mysql2`](https://www.npmjs.com/package/mysql2)を使用します。

```bash
npm install --save mysql2
```

`Node.js`+[`Express.js`](https://expressjs.com/ja/)を使用したWEBアプリケーションの場合は下記のように使用します。

```javascript:javascript
const mysql = require("mysql2/promise");

const pool = mysql.createPool({
    host: process.env.DB_HOST,
    user: process.env.DB_USER,
    password: process.env.DB_PASSWORD,
    database: process.env.DB_NAME,
});

app.get("/list", async (req, res) => {
    try {
        const [results] = await pool.query("SELECT * FROM table");
        res.render("list.ejs", { results: results });
    } catch {
        res.status(500).send("Database Error");
    }
});
```

# 4. LOLIPOP!マネージドクラウドのサーバーにSSH接続する
LOLIPOP!マネージドクラウドに登録するための公開鍵・秘密鍵を生成します。
```bash:local
cd ~/.ssh
ssh-keygen -t rsa
```
生成した公開鍵は、[`ダッシュボード>SSH公開鍵の管理`](https://mc.lolipop.jp/console/sshkeys)画面から追加します。

プロジェクトの`SSH/SFTP`欄の`SSHコマンド`を使用して、LOLIPOP!マネージドクラウドのサーバーにSSH接続します。
```bash:local
ssh -p 22 <ユーザー名>@<ホスト>
```

# 5. テーブルの作成
SSH接続した状態で、`mysql`を実行します。`データベース名`や`ユーザー名`、`ホスト名`は[手順.1](https://qiita.com/drafts/168b112a8aeb6988b017/edit#1-データベースの情報を確認する)で確認したものを入力してください。
```bash:ssh
mysql -u <ユーザー名> -p -h <ホスト名> <データベース名>
```

`mysql`のインターフェースが開かれたら任意のテーブルを作成します。
```sql
mysql> CREATE TABLE hoge (id INT AUTO_INCREMENT,fuga TEXT, PRIMARY KEY (id));
```

:::note
あらかじめ作成したSQLファイルを実行する事もできます。
pushしたリポジトリは`/var/app/current`上に配置されているので、下記のようなコマンドで実行できます。

```bash:ssh
mysql -u <ユーザー名> -p -h <ホスト名> <データベース名> < ./current/hoge.sql
```
LOLIPOP!マネージドクラウドのサーバーは、キーボードから日本語が入力できない初期設定になっているので、日本語のデータを`INSERT`したいときはSQLファイルを実行する方法が簡単です。

日本語データが文字化けする場合は`mysql`コマンド実行時に下記のように文字コードを指定してください。
```bash:ssh
mysql -u <ユーザー名> -p -h <ホスト名> <データベース名> --default-character-set=utf8mb4 < ./current/hoge.sql
```
:::

# 6. 環境変数の設定
環境変数からデータベースの接続情報を利用する場合はプロジェクトの`環境変数設定`から設定しておきます。

![スクリーンショット 2025-01-26 18.25.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2885419/8eabf8b8-4d87-6994-5508-eb6ecfc95772.png)

設定した環境変数は、通常の環境変数と同様下記のように利用できます。
```javascript:javascript
const pool = mysql.createPool({
    host: process.env.DB_HOST,
    user: process.env.DB_USER,
    password: process.env.DB_PASSWORD,
    database: process.env.DB_NAME,
});
```

# おわりに
ここまでの手順で、LOLIPOP!マネージドクラウドにデプロイしたWEBアプリケーションからデータベースが利用できるようになります。

:::note
![スクリーンショット 2025-01-26 17.29.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2885419/6d9e736c-a8f4-27a0-9fc7-11e4a2addbd9.png)

ちなみに、なぜかデータベースの利用方法は公式の**サポート対象外**となっています。:thinking:
:::

# 参考文献

https://sidorares.github.io/node-mysql2/docs