node.js MySQLではなくMySQL2を使ったほうがいいみたい

node.js mysql2 promise mariadb

AutoItとは別にnode.jsを使い始めているんですが、MariaDB (MySQL)にデータを入れたく、最初はMySQLパッケージを入れていたんですが、MySQL2のほうが良いみたいなので。
更に言うとmysql2/promise がいいですね。

mysql2はmysqljs/mysqlとの協業で作り直し、メンテナンスされているパッケージのようで、ググるとmysqlばかり出てきますが、mysql2のほうがいいですね。
互換があるので勿論mysql記事も十二分に活用できると思います。

※随時更新していきます

スポンサーリンク

1.npm install mysql2

mysql2。下記ページによると、mysqljs/mysqlとマッチするよう、そのチームと一緒になりスクラッチから作り直したとのこと。すんなり移行できるように設計したと。

mysql2
fast mysql driver. Implements core protocol, prepared statements, ssl and compression in native JS. Latest version: 3.9.2, last published: a month ago. Start us...

2. 動作確認

まずは基本的な使い方。successと出れば接続は出来ていますね。

const mysql = require('mysql2');
const db_setting = {
 host: 'localhost',
 user: 'dbuser',
 password: 'pass',
 database: 'testdb'
};
ley mycon = null;

(async() => {
 try {
   mycon = await mysql.createConnection(db_setting);
   mycon.connect(function(err){
     if(err){
       console.log(err);
     }else{
       console.log("success");
     }
   }
 } catch(e) {
    console.log(e);
 }

 if( mycon ){
   mycon.end();
 }
})();

3. Prepared ステートメントを使う

execute()を使うと、prepareとqueryを行うのでこの普段使いが良さそうですね。queryで呼ぶのは止めたほうが良いです。(prepareしているならいいですが)

let d = [1,"2020"]
let sql = 'select * from `table` where `flag`=? and `text`=?';

connection.execute(sql,d, function(err,results,fields){
  console.log(results);
  console.log(fields);
});

4. insert後、insertIdを取得する

insertした結果、resultsには以下が入っているので、result[‘insertId’]で取得すればOK

ResultSetHeader {
  fieldCount: 0,
  affectedRows: 1,
  insertId: 3,
  info: '',
  serverStatus: 2,
  warningStatus: 0
}

5. Promise ラッパーを使う

Promise APIをサポートしているのはnode.jsを今使うのには必須ですよね。
require(‘mysql2/promise’); にします。
これを使うとasync/await使えますが、コールバックは認識しなくなります。
mycon.execute(sql,d, function(..) のfunction部分ですね。
その代わり戻り値で制御できるので、コールバックだとネスト化し深くなっていくのを防げてスッキリします。

const mysql = require('mysql2/promise');

const db_setting = {
  host: 'localhost',
  user: 'dbuser',
  password: 'userpass',
  database: 'dbname'
};
let mycon = null;

(async() => {
 try {
  mycon = await mysql.createConnection(db_setting);
 }catch(e){
  console.log(e);
  
 }

 let sql = 'select * from `tablename`';
 let d = [];
 const [rows, fields] = await mycon.execute(sql,d);
 logout(rows);

 if( mycon ){
   mycon.end();
 }
})();

5.1 insertはquery()

execute()はprepare()とquery()の組み合わせだから?中身良く見てから再度更新しますが、query()なら動きます。

let sql = 'insert into `table` set ?';
let d = { name: '山田さん', age: 30, sec: 1 };
const [rows] = await mycon.query(sql,d);
console.log(rows);

rowsにはinsertIdなど入っています。rows.insertIdでも良し、rows[‘insertId’]でも良しです。

ResultSetHeader {
  fieldCount: 0,
  affectedRows: 1,
  insertId: 4,
  info: '',
  serverStatus: 2,
  warningStatus: 0
}

関数にしちゃいましょう。


(async() => {
 ...

 let d = {name: '山田', age: 30, sex: 1};
 const insertid = await db_insert('table', d);
 if( insertid == 0 ){
   //insert error
 }
 
 d = { targetid: insertid, zipcode:'1500001', pref:'東京都' };
 const id2 = await db_insert('table2', d );

 ...
})();


// insert テーブル名とデータは呼ぶ側で作っておく
async function db_insert(tablename, d)
{
 let sql = 'insert into ' + tablename + ' set ?';
 const [rows] = await mycon.query(sql, d);
 return rows.insertId;
}

9. 参考リンク

[node.js] Express,mysql2/promiseでasync/await使って簡潔に書く - Qiita
はじめまして、普段はPMをやっているtatsukenと申します。はじめまして研修の一環でvue.js、expressを書くことがあったので、そのことを中心にまとめていきたいと思いますはじめにE…

コメント

タイトルとURLをコピーしました