Corredor

ウェブ、プログラミングの勉強メモ。

MySQL DB を Node.js から操作してみる

MySQL DB を Node.js から操作する、mysql というそのものズバリな npm パッケージがあったので試してみた。ついでに、コレを Promise 化した 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 で完結」はできる、というところ。

3ステップでしっかり学ぶ MySQL入門 [改訂2版]

3ステップでしっかり学ぶ MySQL入門 [改訂2版]