スキップしてメイン コンテンツに移動

node.js で SQLite を async を使用して同期的に使用する

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 がわかりや・・・すい?
まだまだ私のレベルが低いからなんとも言えないのだけど。。。はぁ・・・

このブログの人気の投稿

記述試験の書き方(仮)

記述試験の書き方(仮) 1,まえがき   法学部の試験では記述式の試験が出てくる。   その試験では、あるテーマについて自由に論ぜよとされている。 しかし、論ぜよと言われても、どのように論じればいいのか、すなわち、記述の仕方について教わったことがない(よくよく考えると、法的文章力を習得させる事だけが目的の授業はないと思われる)。   本稿では、私自身が法学畜になり、見聞きし、実際に活用している論述方法についてまとめている、はずである。その要点は、①条文、判例、学説を使う。②単なる事実と法的事実を区別する。③文章内に一貫性を持たせる。である。 法律と、プログラミング

本サイトの今後について

告知 本サイトは今後更新されることは、おそらくありません。 過去記事等はこのまま放置するつもりです。内容の陳腐化並びにその正確性等については保証はできません。自己責任で活用いただければと思います。 This site won't update in future. And Thank's everyone. new site -> sysrigar

node.js で SQLite3 を使用するコードを書くときの予備録

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.lo