2012年11月27日 星期二

Using mysql in Node.js

寫SQL的人通常都會遇到一次一個table有很多欄位的狀況
傳統的方式是透過sql的prepare statement
再透過一個一個的set來設定那些問號(prepare statement中的值帶入方式,一般都以"?"來代表有值耀輸入)
有別於傳統,在物件導向程式語言中可以透過setter的方式來建立欄位
再透過像Hibernate的資料庫framework將資料一次鍵入DB
但Node.js中則沒那麼多規則...
但是如果要處理一堆問號跟參數的傳入,又不想要眼花...可以透過一些"方法"...


目的在提供一個可以重複利用的模組,讓任何require進來的程式可以直接操作 
# vi sql.js
var util = require('util');                                                                                                                                            
function buildSql(params){
  var sql = "insert into xxxx (%s) values (%s)";
  var k = '', v = '';
  var arr = Object.keys(params);
  var cond = [];
  for(var i = 0 ; i < arr.length ; i++){
      k += arr[i] ;
      v += '?';
      if(i < arr.length -1){
        k += ',';
        v += ',';
      }
      cond.push(params[arr[i]]);
  }
  var finalsql = util.format(sql,k,v)
  return {sql:finalsql, cond:cond};
}
exports.buildSql = buildSql;


實作測試
# testSql.js
var sql = require('./sql');                                                                                                                                            
var opt = {}
opt["k1"] = 'v1';
opt["k2"] = 'v2';
var s = sql.buildSql(opt);
console.log(JSON.stringify(s));


結果輸出
# node testSql.js 
{"sql":"insert into xxxx (k1,k2) values (?,?)","cond":["v1","v2"]}


延伸這樣的組和參數與欄位的方式
也可以開發一套lib作為Node.js的Hibernate喔∼