LoginSignup
20
16

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-03-02

はじめに

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

参考にしたもの
Node.jsでMySQLを使うメモ on @Qiita
NoSQLじゃなくてMySQLを使いたい!Node.jsのmysqlモジュールの使い方
npm:node-mysql

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

簡単な動作確認

設定

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

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

CREATE TABLE

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

INSERT

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

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

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

ひとつめ

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

ふたつめ

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使ったほうが綺麗にかけます。

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でトランザクションしたいんだけど

なんか良い感じに(略
詳しい人教えてください。。→検証中です。

おわりに

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

20
16
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
20
16