arrow-right hamburger logo-mark social-facebook social-github social-twitter
2017.01.03

Node.jsアプリケーションからMySQLにアクセスする

のびすけ

Node.js Magazine

こんにちは、dotstudioの代表ののびすけです。

前回の記事(AzureでMySQLのセットアップと接続方法)に続きMySQLの話です。

今日は初心者向けに、Node.jsからMySQLにアクセスする方法をチュートリアル的に紹介します。

MySQLモジュール(ドライバー)

こちらのモジュールを利用します。 おそらく一番利用されているMySQLのNode.jsモジュール(ドライバー)になります。

https://www.npmjs.com/package/mysql

npm init --yes
npm i mysql --save 

これでインストールはできました。

MySQLデータベースを用意

接続を試す前にデータベースが用意できているか確認しましょう。

前回の記事(AzureでMySQLのセットアップと接続方法)などを参照してみましょう。

仮データをいれておきましょう。

今回は’test_user’テーブルを作って一件データを入れておきました。

CRUD(クラッド)とSQL

データアクセスの前にCRUDについて少し触れます。 CRUDはデータベースシステムなどの基本概念であるデータの作成(Create)、読み出し(Read)、更新(Update)、削除(Delete)を表す言葉です。

SQLはデータベースを操作するための言語です。 MySQLの操作の最初のステップとして、SQLを使用してCRUDを実現してみましょう。

CRUDはSQL構文では、以下のような形で対応しています。

この4つの構文に対応してコードを書いていきましょう。

接続テストとRead(SELECT文)

まずはNode.jsからMySQLへの接続テストをしつつ、データ表示のReadにあたるSELECT文を使います。

参考: http://www.dbonline.jp/mysql/select/index1.html

app.jsを作成しましょう。

//app.js

'use strict'

const mysql      = require('mysql');
const connection = mysql.createConnection({
    host     : 'hoge.hoge.com',
    user     : 'n0bisuke',
    password : 'n0bipass',
    database : 'nobidb'
});

//ここからMySQLアクセス
connection.connect();

let sql = 'select * from nobidb.test_user';
connection.query(sql, (err, rows, fields) => {
  if (err) throw err; 
  console.log('test_userテーブル: ', rows);
});

connection.end();

7〜10行目について

16行目がSQLです。

SELECT文は「select カラム名 from DB名.テーブル名」が基本になります。 全てのカラムを取得する場合は*を指定します。

16行目のSQL文は「nobidbデータベースのtest_userテーブルの全てのカラムの情報を取得する」という内容になります。

それでは実行してみましょう。

$ node app.js
test_userテーブル:  [ RowDataPacket { id: 11, name: 'n0bisuke', created: 2017-01-01T21:35:26.000Z } ]

これで無事にNode.jsとMySQLの接続が確立され、予め登録していたtest_userテーブルの中身が表示(Read)されました。

Create(INSERT文)

次にデータ作成のCreateにあたるINSERT文を使ってみましょう。

参考: http://www.dbonline.jp/mysql/insert/index1.html

app.jsの16行目を以下に書き換えましょう。

let sql = `insert into nobidb.test_user (name) values ("sugawara")`;

INSERT文の基本は「insert into DB名.テーブル名 (カラム名1, カラム名2) values (値, 値)」という形になります。 今回の文では「nobidbデータベースのtest_userテーブルのnameカラムにsugawaraという文字列を入れてデータを作成する」という意味になります。

それでは実行してみましょう。

$ node app.js
test_userテーブル:  OkPacket {
  fieldCount: 0,
  affectedRows: 1,
  insertId: 31,
  serverStatus: 2,
  warningCount: 0,
  message: '',
  protocol41: true,
  changedRows: 0 }

クライアントなどで確認してもしっかり行が追加されていることが分かります。

Update(UPDATE文)

次にデータ更新のUpdateにあたるUPDATE文を使ってみましょう。

参考: http://www.dbonline.jp/mysql/insert/index7.html

app.jsの16行目を以下に書き換えましょう。

let sql = `update dsdb.test_user set name="すがわら" where id = 31`;

UPDATE文の基本は「update DB名.テーブル名 set カラム名1=更新内容1 カラム名2=更新内容2 where 条件」という形になります。 今回の文では「nobidbデータベースのtest_userテーブルの、idが31のnameカラムをすがわらという文字列にデータ更新する」という意味になります。

それでは実行してみましょう。

$ node app.js
test_userテーブル:  OkPacket {
  fieldCount: 0,
  affectedRows: 1,
  insertId: 0,
  serverStatus: 2,
  warningCount: 0,
  message: '(Rows matched: 1  Changed: 1  Warnings: 0',
  protocol41: true,
  changedRows: 1 }

クライアントなどで確認してもid31の行のnameがすがわらに更新されているのが分かります。

Delete(DELETE文)

最後にデータ削除のDeleteにあたるDELETE文を使ってみましょう。

参考: http://www.dbonline.jp/mysql/insert/index10.html

app.jsの16行目を以下に書き換えましょう。

let sql = `delete from dsdb.test_user where id = 31`;

DELETE文の基本は「delete from DB名.テーブル名 where 条件」という形になります。 今回の文では「nobidbデータベースのtest_userテーブルの、idが31の行を削除する」という意味になります。

それでは実行してみましょう。

$ node app.js
test_userテーブル:  OkPacket {
  fieldCount: 0,
  affectedRows: 1,
  insertId: 0,
  serverStatus: 2,
  warningCount: 0,
  message: '',
  protocol41: true,
  changedRows: 0 }

クライアントなどで確認してもid31の行が削除されているのが分かります。

ここまでで、Node.jsからMySQLにアクセスしてCRUDをする操作の紹介をしました。

Tips: node-mysql2

Node.jsからMySQL接続のメモ(とnode-mysql2)にもあるようにnode-mysql2というモジュールもありますので、ベンチマークが気になり始めたら利用を試みるのも良いかもしれません。

$ npm i mysql2 --save

でインストールして

const mysql = require('mysql');

の読み込み箇所を

const mysql      = require('mysql2');

に修正するだけで使えるので移行も楽そうです。

おわりに

Node.jsからMySQLにアクセスする方法を紹介しました。 基礎的な内容になるので、初めてチャレンジする方は参考にして下さい。

SQL直書きだと脆弱性が……とかの話はありそうですがそれはまた別の機会で書けたらと思います。

それでは。