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])