nodejs-mysql-queries 解決node中卦方,多條sql執(zhí)行嬉愧,最后一條成功后回調(diào)問題
下面是檢索到的好文章~
https://github.com/zzzhan/nodejs-mysql-queries
安裝
$ npm install mysql-queries --save
How to Use
Init mysql-queries to somewhere,such as app.js of Express, like this:
var options = {
host: 'localhost',
port: 3306,
user: 'db_user',
password: 'password',
database: 'db_name'
};
require('mysql-queries').init(options);
Use it to some other module, like this:
Execute SQLs directly
var sqlclient = require('mysql-queries'),
sqls = ['SELECT * FROM prod_unit WHERE NAME=? limit 1',
'INSERT INTO prod_unit(name) values(?)',
'INSERT INTO product(name, type_id, unit_id, price) VALUES(?, ?, ?, ?)'];
sqlclient.queries(sqls,
[[data.unit_name],[data.unit_name],[data.name,data.type_id,data.unit_id,data.price]],
function(err, results){
if(!!err) {
console.log(err);
} else {
//If not error, the "results" is the results of the SQLs as array.
console.log(results);
}
});
Execute SQLs with condiction
qlclient.queries(sqls,
[[data.unit_name],[data.unit_name],[data.name,data.type_id,data.unit_id,data.price]], {
skip:function(i, arg, results) {
var skip = false;
switch(i) {
case 1:
//handle second SQL
//Execute the second SQL depending on the first SQL result.
skip = results[0].length!==0;
break;
case 2:
//If the second SQL executed, passing the "insertId" to the third SQL as parameter.
if(results[0].length===0) {
arg[2]=results[1].insertId;
}
break;
}
return skip;
}
}, function(err, results){
if(!!err) {
console.log(err);
} else {
//If not error, the "results" is the results of the SQLs as array.
console.log(results);
}
});
Execute only one SQL
sqlclient.query('SELECT * FROM prod_unit', function(err, result){
if(!!err) {
console.log(err);
} else {
console.log(result);
}
});
Features
- Less code when executing multiple SQLs
- Support transaction of connection
- Support connection pool
- Auto release the connection
Running Tests
With your correct configured of MySQL on ./test/mysql.json
, running tests is as simple as:
npm test
使用mysql-queries說明
//實(shí)際使用中可以在應(yīng)用啟動(dòng)時(shí)進(jìn)行初始化(只需執(zhí)行一次)
require('mysql-queries').init(conf);
//執(zhí)行多條SQLs
var mq = require('mysql-queries');
mq.queries(sqls,
[[params.unit_name],[params.unit_name],[params.name,params.type_id,params.unit_id,params.price]], function(err, results){
if(err) {
console.log(err);
} else {
//"results"為數(shù)組,其為多條SQL的執(zhí)行結(jié)果.
console.log(results);
}
});
進(jìn)階用法--根據(jù)前面SQL的執(zhí)行結(jié)果,判斷是否執(zhí)行當(dāng)前SQL
例如上述SQLs,在新增商品時(shí)允許自定義單位浴骂,如果單位不存在,新建商品單位繁疤。否則睁蕾,直接新增商品。
mq.queries(sqls,
[[params.unit_name],[params.unit_name],[params.name,params.type_id,params.unit_id,params.price]], {
skip:function(i, arg, results) {//skip判斷是否忽略當(dāng)前SQL的執(zhí)行,返回true忽略,false不忽略
var skip = false;
//i為SQLs的索引號(hào)
switch(i) {
case 1:
//根據(jù)第1條SQL的結(jié)果族阅,判斷是否忽略執(zhí)行第2條SQL
skip = results[0].length!==0;
break;
case 2:
//如果第二條被執(zhí)行篓跛,其結(jié)果中的"insertId"將作為第3條SQL的參數(shù)
if(results[0].length===0) {
arg[2]=results[1].insertId;
}
break;
}
return skip;
}
}, function(err, results){
if(err) {
console.log(err);
} else {
//"results"為數(shù)組,其為多條SQL的執(zhí)行結(jié)果.
console.log(results);
}
});
另外
mysql-queries除了上述對(duì)代碼的簡(jiǎn)化外, 其還采用了數(shù)據(jù)源和事務(wù)處理, 從而提高了開發(fā)效率和實(shí)用性,給數(shù)據(jù)庫(kù)操作帶來了很大的便利坦刀。