基于nodejs的mysql快速拼接(包含增删改查),事务控制工具,上传此文件只为技术交流;若您有更好的想法,欢迎指正,不胜感激
1、拼接sql后半段条件(字符串返回模式)
sql="select * from tableName where 1=1" + exports.pushParams(con,tableAlias)
/**
* 将Mongodb数据库的查询条件解析为sql查询条件
*
* 传入:
var conditionMap = {
a:'',//普通传参
b:'1',
c:['2','3'],//传递数组 in(arr)
d:{$nin:[4,5]}, //传递数组 not in (arr)
$or:[{e:'6'},{f:'7'}],// 或条件 (e=6 or f=7)
$or1:[{e:'6'},{f:'7'}],// 关键字($or+纯数字)或条件 (e=6 or f=7)
$or2:[{e:'6'},{f:'7'}],// 或条件 (e=6 or f=7)
$isnull:['g','h'], // null字段查询 g IS NULL AND h IS NULL
$null:['g','h'], // null字段查询 g IS NULL AND h IS NULL
$isnotnull:['k','l'] // not null 字段 k IS NOT NULL AND l IS NOT NULL
$isnotanull:['k','l'] // not null 字段 k IS NOT NULL AND l IS NOT NULL
gt:{$gt:6},// gt大于6
gte:{$gte:6},// gte大于等于6
lt:{$lt:6},// lt小于6
lte:{$lte:6},// lte小于等于6
ne:{$ne:6}, // ne 不等于 6
m:null, //这个传参是错的,需要用上面的方法传递空值字段查询条件 $isNull
}
*
* 注意:模糊查询时,请将正则表达式变成sql的正则:"%_XXX_%" 形式
* tableAlias 表名的别名 tableAlias+'.'+i=conditionMap[i]
*
* 返回值为“AND ??=?? AND (??=?? OR ??=?? OR(??=?? AND ??=??)) AND ?? IN(??,??) ”
*/
exports.pushParam = function (conditionMap, tableAlias, cb) {
var err = null;
var tf = tableAlias && typeof tableAlias == 'string';
var sql = '';
if (isEmpty(conditionMap)||Object.prototype.toString.call(conditionMap)!=='[object Object]') {
err = new Error('sqlParamUtil.pushParam;传入参数为空或者传入的参数不为对象')
// console.error(err);
if (cb) cb(err, null);
return sql;
}
for (var i in conditionMap) {
var j = fn(conditionMap[i]);
if (j != 'objIsNotArr' && Array.isArray(conditionMap[i][j])) {
if (conditionMap[i][j].length == 0) {
conditionMap[i][j].push(null);
}
if (j.toLowerCase() == '$in') {
sql += " AND `" + (tf ? tableAlias + '`.`' + i : i) + "` IN (";
sql += pool.escape(conditionMap[i][j]);
sql += ") ";
} else if (j.toLowerCase() == '$nin') {
sql += " AND `" + (tf ? tableAlias + '`.`' + i : i) + "` NOT IN (";
sql += pool.escape(conditionMap[i][j]);
sql += ") ";
}
} else if (/^\$or\d{0,}$/.test(i.toLowerCase())) {//or 的条件回到一个conditionMap对象
sql += ' AND (';
for (var m = 0; m < conditionMap[i].length; m++) {
sql += '(';
sql += exports.pushParam(conditionMap[i][m], tableAlias).replace(/AND/, 'OR').replace(/OR/, '');
sql += " OR ";
sql = sql.substr(0, sql.length - 3);
sql += ") OR ";
}
sql = sql.substr(0, sql.length - 3);
sql += ")";
}
//将 null 值的条件打包为一个数组 {$null:['a字段','b字段']}
else if ((i.toLowerCase() == '$null' || i.toLowerCase() == '$isnull') && Array.isArray(conditionMap[i])) {
for (var k in conditionMap[i]) {
sql += ' AND `' + (tf ? (tableAlias + '`.`' + conditionMap[i][k]) : conditionMap[i][k]) + '` is NULL ';
}
} else if ((i.toLowerCase() == '$isnotnull' || i.toLowerCase() == '$isnotanull') && Array.isArray(conditionMap[i])) {
for (var k in conditionMap[i]) {
sql += ' AND `' + (tf ? (tableAlias + '`.`' + conditionMap[i][k]) : conditionMap[i][k]) + '` is NOT NULL ';
}
}
//将 普通数组解析为 in
else if (i.toLowerCase() != '$isnotnull' && i.toLowerCase() != '$null' && i.toLowerCase() != '$isnull' && i.toLowerCase() != '$isnotanull' && Array.isArray(conditionMap[i])) {//直接传数组时,用in来解析
if (conditionMap[i].length == 0) {
conditionMap[i].push(null);
}
sql += " AND `" + (tf ? tableAlias + '`.`' + i : i) + "` IN (";
sql += pool.escape(conditionMap[i]);
sql += ") ";
} else {
if (Object.prototype.toString.call(conditionMap[i]) !== '[object Object]' && (String(conditionMap[i]).indexOf('%') > -1 || String(conditionMap[i]).indexOf('_') > -1 || String(conditionMap[i]).indexOf('[') > -1)) {