MySQL DB を Node.js から操作してみる
MySQL DB を Node.js から操作する、mysql というそのものズバリな npm パッケージがあったので試してみた。ついでに、コレを Promise 化した promise-mysql もご紹介。
- GitHub - mysqljs/mysql: A pure node.js JavaScript Client implementing the MySql protocol.
- GitHub - lukeb-uk/node-promise-mysql
mysql
パッケージを使う
今回、MySQL DB はどこかに構築済みな前提とする。
適当な作業用ディレクトリを作り、npm init
で Node.js 環境を準備。以下のコマンドで mysql
パッケージをインストールする。
$ npm install mysql --save
次に、main.js
ファイルを作り、以下のように実装する。
const mysql = require('mysql');
// 接続先情報は適当に変更すること
const connection = mysql.createConnection({
host: 'localhost',
user: 'myuser',
password: 'mypassword',
database: 'mydb'
});
// DB 接続 (書かなくても大丈夫)
connection.connect();
// MY_USERS テーブルを SELECT してみる
connection.query('SELECT * FROM my_users', (error, results, fields) => {
if(error) {
throw error;
}
console.log(results);
});
// DB 切断
connection.end();
コレを以下のように実行する。
$ node main.js
SQL が実行できたことだろう。
SHOW DATABASES
みたいな MySQL 用のクエリも使えた。- クエリ SQL 文字列からパラメータを外出しした、PreparedStatement も書ける。公式の README を参照のこと。
query()
のコールバック関数のfields
は、SELECT したテーブルのフィールド定義が確認できるモノ。データはresults
に入っている。
結構すんなり使えて良い感じだが、コールバック形式で処理するのがちょっとなぁ…というところ。
そこで promise-mysql
パッケージを使う
そこで、mysql パッケージを Promise でラップした promise-mysql
パッケージを使ってみよう。
$ npm i promise-mysql -S
先程の main.js
は以下のように書き換えられる。
const mysql = require('promise-mysql'); // Promise 版を使うよ
let connection; // Connection を控えておく変数だよ
mysql.createConnection({
host: 'localhost',
user: 'myuser',
password: 'mypassword',
database: 'mydb'
})
.then((conn) => {
// Connection を控えておく
connection = conn;
// MY_USERS テーブルを SELECT してみる
return connection.query('SELECT * FROM my_users');
})
.then((rows) => {
console.log(results);
// 切断する
connection.end();
})
.catch((error) => {
console.error(error);
// Connection の存在を確認して切断する
if(connection && connection.end) {
connection.end();
}
});
かなりスッキリ、見通しが良くなったと思う。
ブラウザで動くワケではない…
ついつい、「Node.js で動作する = JavaScript コードなワケだし、ブラウザでも動くっしょ!」と思ってしまっていたが、裏側では Node.js のネイティブな機能を使っているので、webpack でバンドルしてブラウザで main.js
的なコードを実行する…ってのは不可能。
Node.js を実行環境とする Express とかでサーバを立ててあれば、Express サーバ内で動かすことはできるので、「JavaScript で完結」はできる、というところ。