Node.jsアプリケーションからMySQLにアクセスする
こんにちは、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構文では、以下のような形で対応しています。
- Create -> INSERT文
- Read -> SELECT文
- Update -> UPDATE文
- Delete -> DELETE文
この4つの構文に対応してコードを書いていきましょう。
接続テストとRead(SELECT文)
まずはNode.jsからMySQLへの接続テストをしつつ、データ表示のReadにあたるSELECT文を使います。
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行目について
- host: MySQLのホスト名です。仮にhoge.hoge.comを指定しています。
- user: MySQLに登録してあるユーザー名です。仮にn0bisukeを指定しています。
- password: MySQLに登録してあるパスワードです。仮にn0bipassを指定しています。
- database: MySQLで利用するDB名です。仮にnobidbを指定しています。
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文を使ってみましょう。
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文を使ってみましょう。
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文を使ってみましょう。
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直書きだと脆弱性が……とかの話はありそうですがそれはまた別の機会で書けたらと思います。
それでは。