node.js で SQLite を async を使用して同期的に使用する
node.js で SQLite を使うと何が怖いって非同期処理って所。どのようにコードが動くのか分かり辛い。
そこで同期処理っぽくしてみたい。
async というライブラリを使用するとそれっぽいことができるそうなのでサンプルを書いた。
"use strict"; /* * SQlite のテスト * 2014 / 09 / 17 */ var fs = require("fs"); var path = require("path"); var async = require('async'); var sqlite3 = require('sqlite3').verbose(); var urlDatabase = __dirname + "\\database.db"; var db = null; // 非同期処理だと何が起きるかわからないので同期処理で進めてゆく async.waterfall([ function (callback) { console.log("[DB OPEN]"); // データベースオープン処理 if (path.existsSync(urlDatabase)) { console.log("[DB OPEN]\tDatabase was created."); // sqlite3.Database を呼ぶと自動的に urlDatabase が作られてしまうから確認してから初期化する。 db = new sqlite3.Database(urlDatabase); callback(null); return; } // データベース構築 db = new sqlite3.Database(urlDatabase); db.serialize(function () { // テーブル作成 db.run("CREATE TABLE table_hoge (id INTEGER NOT NULL, t TEXT, d INTEGER NOT NULL)"); }); callback(null); return; }, function (callback) { console.log("[DB ACCESS]"); // データベース操作処理 db.serialize(function() { // データ入力 var stmt = db.prepare("INSERT INTO table_hoge VALUES (?, ?, ?)"); for (var i = 0; i < 10; i++) { stmt.run( i, "ひゃっはー : " + i, (new Date()).getTime() ); } stmt.finalize(); }); callback(null); return; }, function (callback) { console.log("[DB VIEW]"); // データベース表示処理 db.serialize(function() { // データ表示 db.each("SELECT rowid AS id,* FROM table_hoge ORDER BY id DESC", function(err, row) { console.log('' + '\nID : ' + row.id + '\nTEXT : ' + row.t + '\nTIME : ' + row.d ); }, function() { // SQL 文の実行が完了してから次の処理へ進む。 callback(null); }); }); return; }, function (callback) { // データベース終了処理 console.log("DATABASE CLOSE."); db.close(); callback(null, "すべてOKです"); return; } ], function (err, result) { if (err) { console.log("[ERROR]\t" + err); return; } console.log("waterfall all done. : " + result); });
結果
[DB OPEN] [DB ACCESS] [DB VIEW] ID : 9 TEXT : ひゃっはー : 9 TIME : 1410956621663 ID : 8 TEXT : ひゃっはー : 8 TIME : 1410956621663 ID : 7 TEXT : ひゃっはー : 7 TIME : 1410956621663 ID : 6 TEXT : ひゃっはー : 6 TIME : 1410956621663 ID : 5 TEXT : ひゃっはー : 5 TIME : 1410956621663 ID : 4 TEXT : ひゃっはー : 4 TIME : 1410956621663 ID : 3 TEXT : ひゃっはー : 3 TIME : 1410956621663 ID : 2 TEXT : ひゃっはー : 2 TIME : 1410956621663 ID : 1 TEXT : ひゃっはー : 1 TIME : 1410956621663 ID : 0 TEXT : ひゃっはー : 0 TIME : 1410956621663 DATABASE CLOSE. waterfall all done. : すべてOKですこんなかんじで非同期なわけのわからない node.js on sqlite がわかりや・・・すい?
まだまだ私のレベルが低いからなんとも言えないのだけど。。。はぁ・・・