AutoItとは別にnode.jsを使い始めているんですが、MariaDB (MySQL)にデータを入れたく、最初はMySQLパッケージを入れていたんですが、MySQL2のほうが良いみたいなので。
更に言うとmysql2/promise がいいですね。
mysql2はmysqljs/mysqlとの協業で作り直し、メンテナンスされているパッケージのようで、ググるとmysqlばかり出てきますが、mysql2のほうがいいですね。
互換があるので勿論mysql記事も十二分に活用できると思います。
※随時更新していきます
1.npm install mysql2
mysql2。下記ページによると、mysqljs/mysqlとマッチするよう、そのチームと一緒になりスクラッチから作り直したとのこと。すんなり移行できるように設計したと。

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. 参考リンク

コメント