utamt engineer blog

アプリケーション開発について学んだことの備忘録です。

node.js + express + MySQL

MySQL インストール

// MySQL Yum リポジトリをシステムのリポジトリリストに追加
$ sudo yum localinstall http://dev.mysql.com/get/mysql57-community-release-el7-7.noarch.rpm

// リポジトリの確認
$ ls /etc/yum.repos.d/mysql-*
/etc/yum.repos.d/mysql-community-source.repo
/etc/yum.repos.d/mysql-community.repo

// インストール
$ sudo yum install -y mysql-community-server

// バージョンの確認
$ mysqld --version
mysqld  Ver 5.7.33 for Linux on x86_64 (MySQL Community Server (GPL))

デーモンの起動

// 起動
$ sudo systemctl start mysqld

// ステータス確認
$ sudo systemctl status mysqld
● mysqld.service - MySQL Server
   Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled)
   Active: active (running) since 日 2021-01-24 01:52:16 UTC; 3s ago
...

// 自動起動の設定
$ sudo systemctl enable mysqld

MySQL 初期設定

パスワードの変更

// root ユーザの初期 PW の確認
$ sudo cat /var/log/mysqld.log | grep root
2021-01-24T01:52:13.521392Z 1 [Note] A temporary password is generated for root@localhost: [パスワード文字列]

// root ユーザでログイン
$ mysql -u root -p
Enter password:  ←  先ほどの [パスワード文字列] を入力する

パスワードを root に変更したいが、
その前に、デフォルトのパスワードポリシー「英大文字・小文字・数字・記号を含む8文字以上の文字列」を変更する必要がある。

// 何かしようとすると、パスワードを変更しなさいと言われる
mysql> create database Test;
ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.

// ただし、"root" に変更しようとするとポリシーを満たさないのでエラーとなる。
mysql> SET PASSWORD = PASSWORD('root');
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements

// ひとまず、適当なパスワードに変更しておく。
mysql> set password for root@localhost=password('passWORD99!');
Query OK, 0 rows affected, 1 warning (0.00 sec)

// 現在のポリシーを確認する。
mysql> SHOW VARIABLES LIKE 'validate_password%';
+--------------------------------------+--------+
| Variable_name                        | Value  |
+--------------------------------------+--------+
| validate_password_check_user_name    | OFF    |
| validate_password_dictionary_file    |        |
| validate_password_length             | 8      |
| validate_password_mixed_case_count   | 1      |
| validate_password_number_count       | 1      |
| validate_password_policy             | MEDIUM |
| validate_password_special_char_count | 1      |
+--------------------------------------+--------+
7 rows in set (0.00 sec)

// 4文字以上 かつ 文字種別なし のポリシーに変更する。 
mysql> SET GLOBAL validate_password_length=4;
Query OK, 0 rows affected (0.00 sec)

mysql> SET GLOBAL validate_password_policy=LOW;
Query OK, 0 rows affected (0.00 sec)

// ポリシーを確認する。
mysql> SHOW VARIABLES LIKE 'validate_password%';
+--------------------------------------+-------+
| Variable_name                        | Value |
+--------------------------------------+-------+
| validate_password_check_user_name    | OFF   |
| validate_password_dictionary_file    |       |
| validate_password_length             | 4     |
| validate_password_mixed_case_count   | 1     |
| validate_password_number_count       | 1     |
| validate_password_policy             | LOW   |
| validate_password_special_char_count | 1     |
+--------------------------------------+-------+
7 rows in set (0.00 sec)

// パスワードを "root" に変更する。
mysql> set password for root@localhost=password('root');
Query OK, 0 rows affected, 1 warning (0.00 sec)

文字コード

// 確認
mysql> show variables like 'character%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | latin1                     |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | latin1                     |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)
  • character_set_database latin1
  • character_set_server latin1

を utf8 に設定する必要があるので、以下を実行

$ sudo vi /etc/my.cnf

//以下をファイルの末尾に追記
character_set_server=utf8
skip-character-set-client-handshake

デーモンを再起動
$ sudo  systemctl restart mysqld

再度ログインして設定を確認する。

$ mysql -u root -p
Enter password:  ←  "root"
mysql> show variables like 'character%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.01 sec)

テーブルの作成

// DB を作成する。
mysql> create database Test;
Query OK, 1 row affected (0.00 sec)

// 作成した DB を指定する。
mysql> use Test
Database changed

// テーブル を作成する。
mysql> create table test_table(id int(11),name varchar(255));
Query OK, 0 rows affected (0.01 sec)

// 適当な値を挿入する。
mysql> insert into test_table values(1,'testname');
Query OK, 1 row affected (0.01 sec)

node.js + mysql の連携

// MySQL パッケージをインストールする。
$ npm install mysql --save
// app.js を作成する。
const express = require('express');
const app = express();

const mysql = require('mysql');

const connection = mysql.createConnection({
  host     : 'localhost',
  user     : 'root',
  password : 'root',
  database : 'Test'
});

app.get('/', (req, res) => {
  connection.query('select * from test_table', (error, results, fields) => {
    if (error) throw error;
    res.send(results[0]);
  });
});

app.listen(8080);