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);
}
});
});