tech.chakapoko.com
Home / Node.js / MySQL

[Node.js][MySQL]接続とクエリの実行

mysqlモジュールのインストール

Node.jsでMySQLに接続するには mysql モジュールを使います。

以下のコマンドでnpmからインストールできます。

$ npm install mysql

接続とクエリの実行

次のコードはMySQLに接続して簡単なクエリを発行するサンプルです。

const mysql = require('mysql');

const connection = mysql.createConnection({
    host: 'localhost',
    database: 'my_database',
    user: 'me',
    password: 'my_password',
});

connection.connect();

connection.query('select 1 as one', (err, results, fields) => {
    if (err) throw err;

    for (const result of results) {
        console.log(result.one);
    }
});

connection.end();

このコードを実行すると次のような結果を出力します。

1

各メソッドの解説

メソッド説明
mysql.createConnectionどのデータベースに接続するかを設定する
connection.connectデータベースとの接続を開始する
connection.queryデータベースに対してクエリを実行し、コールバックでクエリを受け取る
connection.endデータベースと接続を終了します。

mysql モジュールでは同じ接続に対するクエリはすべてキューに入れられ、順番に実行されます。接続を閉じるには connection.end を使用しますが、mysqlサーバーに終了パケットを送信する前に、残りのすべてのクエリーが実行されます。
キューに入っているクエリを実行せず、すぐに接続を閉じたい場合は connection.destroy を仕様します。

トランザクションの利用

mysql モジュールではトランザクションも利用できます。

動作確認のためにテーブルを2つ作ります。

CREATE TABLE `posts` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `content` text NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE `logs` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `message` text NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

この2つのテーブルに同一トランザクションでINSERTを行うコードは次のようになります。

const mysql = require('mysql');

const connection = mysql.createConnection({
    host: 'localhost',
    database: 'my_database',
    user: 'me',
    password: 'my_password',
});

connection.beginTransaction((err) => {
  if (err) { throw err; }

  connection.query('INSERT INTO posts (content) VALUES (?)', ['Hello!'], (error, results, fields) => {
    if (error) {
      return connection.rollback(() => {
        throw error;
      });
    }

    var log = 'Post ' + results.insertId + ' added';

    connection.query('INSERT INTO logs (message) VALUES (?)', log, (error, results, fields) => {
      if (error) {
        return connection.rollback(() => {
          throw error;
        });
      }
      connection.commit((err) => {
        if (err) {
          return connection.rollback(() => {
            throw err;
          });
        }
        console.log('success!');
      });
    });
  });
});

少し読みづらいですが、Promiseを使ってコードの見通しを改善することもできます。

[Node.js][MySQL]Promiseを使ってトランザクションを書きやすくする

コネクションプールの利用

mysql モジュールはコネクションプーリングにも対応しています。

コネクションプールを作るには mysql.createPool を使います。

const mysql = require('mysql');

const pool = mysql.createPool({
    connectionLimit : 10,
    host: 'localhost',
    database: 'my_database',
    user: 'me',
    password: 'my_password',
});

pool.getConnection((err, connection) => {
    if (err) throw err;

    connection.query('select 1 as one', (err, results, fields) => {
        connection.release();

        if (err) throw err;

        for (const result of results) {
            console.log(result.one);
        }
    });

});