Node.jsでMySQLを扱いたかったので独自目線で纏めた


# はじめに
どうも、初投稿です。
Node.jsでMySQLに接続しているのですが、参考にしている情報が古かったりなんだったりかんだったりしたので自分で纏めることにしました。

参考にしたもの
[Node.jsでMySQLを使うメモ on @Qiita](https://qiita.com/PianoScoreJP/items/7ed172cd0e7846641e13)
[NoSQLじゃなくてMySQLを使いたい！Node.jsのmysqlモジュールの使い方](https://www.webprofessional.jp/using-node-mysql-javascript-client/)
[npm:node-mysql](https://www.npmjs.com/package/node-mysql)

他にも有益なページや、「こうしたほうがいいよ！」など有ればコメントにお願いします。

# 簡単な動作確認
## 設定

```js:設定.js
	const mysql = require('/usr/local/lib/node_modules/mysql');

	const mysqlConnect = mysql.createConnection({
		host: 'localhost',
		user: 'root',
		password: '',
		database: 'nodejs'
	});
```
## CREATE TABLE

```js:テーブル追加.js
mysqlConnect.query('CREATE TABLE node_mysql_test (id INT(10) AUTO_INCREMENT, name VARCHAR(32), PRIMARY KEY (id) )');`
```

## INSERT
```js:INSERT.js
    const column = { id: 1, name: 'Nissy' }; // sample
    mysqlConnect.query('INSERT INTO ' + TABLE_NAME + ' SET ?', column, (err, res) => {
        if (err) throw err;

        console.log('Last insert ID:', res.insertId);
    });
```

## UPDATE
``` UPDATE.js
    mysqlConnect.query('UPDATE ' + TABLE_NAME + ' SET name = ? WHERE id = ?',
        ['Nishi', 1],
        (err, result) => {
            if (err) throw err;
            console.log('Changed ${result.changedRows} row(s)');
        }
    );
```

## DELETE
```js:DELETE.js
    mysqlConnect.query('DELETE FROM ' + TABLE_NAME + ' WHERE id = ?', [1], (err,  result) => {
        if (err) throw err;
        console.log('Deleted '+ result.affectedRows + ' row(s)');
    });
```

## SELECT
これは色んな方法がありました。

### ひとつめ

```js:SELECT1.js
mysqlConnect.query('SELECT * FROM ' + TABLE_NAME, (err, rows) => {
    if (err) throw err;
    console.log('Data received from Db:\n');
    console.log(rows);
});
```

### ふたつめ

```js:SELECT2.js
mysqlConnect.query('SELECT * FROM ' + TABLE_NAME, (err, rows) => {
    if (err) 
    console.log('Data received from Db:\n');
    for (var i = rows.length - 1; i >= 0; i--)
    {
        console.log('id: ' + rows[i].id + ' , name: ' + rows[i].name);
    }
});
```


## トランザクション
結論から言うと使えます。
ここの書き方をミスるとトランザクションとして意味が無い、という指摘を受けたのでマジで気をつけてください。
多分async/await使ったほうが綺麗にかけます。

```js:ALL.js
	// テーブル名
	const TABLE_NAME = 'node_mysql_test';

    // 接続
	mysqlConnect.connect();

	// Transaction
	mysqlConnect.beginTransaction(function(err) {
		if (err) {throw err; }

		// INSERT
		let insertSql = 'INSERT INTO ?? SET ? ';
		let insertInserts = [TABLE_NAME, { name: '氷室', age: 23}];
		insertSql = mysqlConnect.format(insertSql, insertInserts);
		mysqlConnect.query(insertSql, (err, res) => {
			if (err) {
				mysqlConnect.rollback(function() {
					throw err;
				});
			}
			console.log('Last insert ID: ' + res.insertId);

			// UPDATE
			let updateSql = 'UPDATE ?? SET ?? = ? WHERE ?? = ?';
			let updateInserts = [TABLE_NAME, 'name', '葛城', 'name', '桐生'];
			updateSql = mysqlConnect.format(updateSql, updateInserts);
			mysqlConnect.query(updateSql, (err, result) => {
				if (err) {
					mysqlConnect.rollback(function() {
						throw err;
					});
				}
				console.log('Change ' + result.changedRows + ' row(s)');

				// COMMIT
				mysqlConnect.commit(function(err) {
					if (err) {
						mysqlConnect.rollback(function() {
							throw err;
						});
					}
					console.log('COMMIT Success!');

					// プリペアリングクエリ
					let sql = 'SELECT * FROM ?? ';
					const inserts = [TABLE_NAME];
					sql = mysqlConnect.format(
						sql,
						inserts,
					);
					mysqlConnect.query(sql, (err, rows) => {
						if (err) throw err;
						console.log(rows);

						// 切断
						mysqlConnect.end();
					});
				});
			});
		});

	});
```
どうでもいいけど氷室は23歳じゃないですよね。失礼しました。

# 疑問コーナー
## 日本語の読み書きは？
日本人なので気になりますよね。読み込んだデータが文字化けしたら嫌ですよね。
JavaScriptのソースとMySQLのテーブルの文字コードが一致していれば基本問題ありませんでした。
安全策を狙うならどちらもutf8にするのがお勧めです。

## 「mysql.format」ってなに？
なんか良い感じにSQL文をバインドしてるのかなーぐらいしか分かりません。
~~詳しい人教えてください。。~~
ローカルでSQL文をバインドしていることが判明しました。
mysqlに標準搭載されているFormat関数とは別のもののようです。

## 「mysql.query」ってなに？
なんか良い感じに（略
詳しい人教えてください。。→調査中です。

使ってみた感じでは、本当にクエリを発行するだけなのですが、
SQL文のバインドなど必要最低限のことはやってくれているので、
もしかしたらMySQLの機能を使っているのかな？
まだ要領つかめてないですが。

## 複数のDBでトランザクションしたいんだけど
なんか良い感じに（略
詳しい人教えてください。。→検証中です。


# おわりに
分からない事だらけなので、コメントで補足して頂ければ追記していきます。
是非とも、よろしくお願いいたします。