node.js で SQLite3 を使用するコードを書くとき、予備録
まず、非同期処理。
C言語や Perl のように上から下に処理が続くと決して思ってはいけない。SQLite3 の each は SQL 文実行完了時に呼び出す関数を指定できる
SQLite をインストールします、
npm install sqlite3
[test.js]
var sqlite3 = require('sqlite3').verbose(); var db = new sqlite3.Database(':memory:'); db.serialize(function() { db.run("CREATE TABLE lorem (info TEXT)"); var stmt = db.prepare("INSERT INTO lorem VALUES (?)"); for (var i = 0; i < 10; i++) { stmt.run("Ipsum " + i); } stmt.finalize(); var listInfo = new Array(); db.each("SELECT rowid AS id, info FROM lorem", function(err, row) { var tmp = new Object(); tmp.id = row.id; tmp.info = row.info; console.log("[ROW]\t" + row.id + ": " + row.info); listInfo.push(tmp); }, function() { // Each 完了時に呼び出される for (var i = 0; i < listInfo.length; i++) { console.log("[BUF]\t" + listInfo[i].id + ": " + listInfo[i].info); } console.log("Finish."); }); }); db.close();
結果
[ROW] 1: Ipsum 0
[ROW] 2: Ipsum 1
[ROW] 3: Ipsum 2
[ROW] 4: Ipsum 3
[ROW] 5: Ipsum 4
[ROW] 6: Ipsum 5
[ROW] 7: Ipsum 6
[ROW] 8: Ipsum 7
[ROW] 9: Ipsum 8
[ROW] 10: Ipsum 9
[BUF] 1: Ipsum 0
[BUF] 2: Ipsum 1
[BUF] 3: Ipsum 2
[BUF] 4: Ipsum 3
[BUF] 5: Ipsum 4
[BUF] 6: Ipsum 5
[BUF] 7: Ipsum 6
[BUF] 8: Ipsum 7
[BUF] 9: Ipsum 8
[BUF] 10: Ipsum 9
Finish.
まぁ見れば分かる通り、each 関数の第三引数を指定しただけなんだけどね。
Database#each(sql, [param, ...], [callback], [complete])